您的位置:首页 > 其它

算法_已知五个>=0的自然数,随机输入5个数,编写算法判断是否能排列成有序的数字。0可以替换成任何数

2014-12-08 08:47 525 查看
一、问题举例:

例1:5、2、4、3、1,是有序递加1的。(成立)

例2:2、0、1、4、5,可以用0代替3。(成立)

例3:1、4、9、2、4,有重复值4,而且不可能排列成有序递加1的数组(不成立)

二、核心思路:

1、去重:通过Set集合,如果重复添加相同的值会返回false。

2、差值:如果是有序的递加1关系,那么最大值与最小值差值一定是四,可以遍历找到最大值最小值对差比较。

三、java参考代码:

import java.util.HashSet;
import java.util.Set;

/**
 * @author 仲丛旭
 * @date 2014/12/08
 */
public class Test {
<span style="white-space:pre">	</span>public static void main(String[] args) {
<span style="white-space:pre">		</span>// /* 测试用例1:正常无0序列 */
<span style="white-space:pre">		</span>// int[] arr = { 1, 3, 2, 5, 4 };
<span style="white-space:pre">		</span>// /*测试用例2:正常有0序列*/
<span style="white-space:pre">		</span>// int[] arr = { 6, 8, 7, 0, 10 };
<span style="white-space:pre">		</span>// /* 测试用例3:有0,但差值大于4 */
<span style="white-space:pre">		</span>// int[] arr = { 0, 8, 6, 0, 11 };
<span style="white-space:pre">		</span>// /* 测试用例4:极端,都是0 */
<span style="white-space:pre">		</span>// int[] arr = { 0, 0, 0, 0, 0 };
<span style="white-space:pre">		</span>/* 测试用例5:极端,都是重复数 */
<span style="white-space:pre">		</span>int[] arr = { 2, 2, 2, 2, 2 };
<span style="white-space:pre">		</span>System.out.println(isLianxu(arr));
<span style="white-space:pre">	</span>}

<span style="white-space:pre">	</span>private static String isLianxu(int[] arr) {
<span style="white-space:pre">		</span>Set<Integer> set = new HashSet<Integer>();// 判断是否有重复数的方法。
<span style="white-space:pre">		</span>int max = -1;// 1、不能从arr[0]开始,因为第一个数可能是0。例:{ 0, 8, 7, 0, 11 }
<span style="white-space:pre">		</span>int min = -1;
<span style="white-space:pre">		</span>boolean isFirst = true;
<span style="white-space:pre">		</span>for (int i = 0; i < arr.length; i++) {
<span style="white-space:pre">			</span>if (arr[i] == 0) {
<span style="white-space:pre">				</span>continue;// 0可以替换成任何数,所以无用。
<span style="white-space:pre">			</span>} else if (isFirst) {// 第一个非零数为min与max初始最大值
<span style="white-space:pre">				</span>max = arr[i];
<span style="white-space:pre">				</span>min = arr[i];
<span style="white-space:pre">				</span>isFirst = false;
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>/* 2、核心算法:最大值与最小值之差超过四,或者有非0的重复值则不连续 */
<span style="white-space:pre">			</span>if (max < arr[i]) {
<span style="white-space:pre">				</span>max = arr[i];
<span style="white-space:pre">			</span>} else if (min > arr[i]) {
<span style="white-space:pre">				</span>min = arr[i];
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>boolean flag = set.add(arr[i]);// 重复添加得到的值为false
<span style="white-space:pre">			</span>// System.out.println(arr[i]);
<span style="white-space:pre">			</span>// System.out.println("flag==" + flag + ",max - min-->" + (max -
<span style="white-space:pre">			</span>// min));
<span style="white-space:pre">			</span>if (max - min > 4 || !flag) {
<span style="white-space:pre">				</span>return "无法排列成继续";
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>return "可以连续";
<span style="white-space:pre">	</span>}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐