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

来源:互联网 发布:代尔塔劳保鞋淘宝 编辑:程序博客网 时间:2024/05/22 17:04

一、问题举例:

例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>}}


0 0
原创粉丝点击