一、问题举例:
例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>}
}