编写此代码,希望能够更好地使用任何算法从已排序或未排序的数组中查找缺失的数字。如果它是一个未排序的数组,我会排序并执行以下内容。
private static void identifyMissingValues(Integer[] ar) {
for(int i = 0; i < (ar.length - 1); i++) {
int next = ar[i + 1];
int current = ar[i];
if((next - current) > 1) {
System.out.println("Missing Value : " + (current + 1));
}
}
}
任何代码都比这更快或更好,请建议。
答案 0 :(得分:2)
任何代码都比这更快或更好,请建议。
否没有这样的事情 - 如果必须访问每个元素,则无法改进O(n)
算法。
答案 1 :(得分:2)
使用BitSet而不是排序。
int[] ar = {7, 2, 6, 8, 10, 4, 3, 2};
int min = IntStream.of(ar).min().getAsInt();
BitSet b = new BitSet();
for (int i : ar)
b.set(i - min);
int i = 0;
while ((i = b.nextClearBit(i + 1)) < b.length())
System.out.println(i + min);
结果
5
9
答案 2 :(得分:1)
对数组进行排序需要O(n*log(n))
。
如果您将数组的所有元素添加到HashSet
(O(n))
运行时间,则可以做得更好,然后检查0
和ar.length - 1
之间的每个数字(或者相关范围是什么)HashSet
是否包含该数字。这需要O(n)
时间。
答案 3 :(得分:0)
我可以知道输入和预期输出编号系列吗?
根据你的代码我觉得系列应该是1的差异,如果我没错。
答案 4 :(得分:0)
所以你有一个n个元素的数组,它以一个整数i开头,包含从i到i + n的所有整数,是吗?例如:
arr = [1,2,3,4,5]
因此,数组中所有数字的总和应该是从i到i + n的数字之和。
例如:sum(arr) = 1+2+3+4+5 = 15
数字1到n之和的公式为n(n+1)/2
所以你可以有一个for循环:
int counter = 0;
for(Integer i : integers)
counter += i
获取数组中的数字总和。
如果您的数组从1开始,则检查counter
变量是否等于n(n+1)/2
,其中n
是数组的长度。
如果你的阵列没有从一个开始,例如arr = [78, 79, 80, 81]
,那么你需要稍微调整一下这个方法,但我确定你能算出来。
答案 5 :(得分:0)
你可以这样做:
Set<Integer> mySet = new TreeSet<Integer>(Arrays.asList(ar));
int min = mySet.first();
for (int i = 0; i < mySet.size(); i++) {
int number = min + i;
if (!mySet.contains(number)) {
System.out.println ("Missing: " + number);
i--;
}
}
答案 6 :(得分:0)
你的方法很好,但我为一个以上的数字丢失了更多的东西......
eg : ar={1,2,4,6,10} // Sorted Array
private static void identifyMissingValues(Integer[] ar) {
for (int i = 0; i < (ar.length - 1); i++) {
int next = ar[i + 1];
int current = ar[i];
if ((next - current) > 1) {
for (int ind = 1; ind < next - current; ind++)
System.out.println("Missing Value : " + (current + ind));
}
}
}
输出是,
Missing Value : 3
Missing Value : 5
Missing Value : 7
Missing Value : 8
Missing Value : 9
答案 7 :(得分:0)
Integer [] list = new Integer[]{1, 12, 85, 6, 10};
Integer previous = null;
Arrays.sort(list);
System.out.println(list);
for(int index = 0; index < list.length; index++){
if(previous == null){
previous = (Integer) list[index];
continue;
}
Integer next = previous + 1;
if(((Integer) list[index] - previous) > 1){
System.out.println("Missing value " + next);
index--;
}
previous = next;
}