给定一个任何大小的数组,在我的例子中,数组大小 5 。
此数组包含1到5之间的所有数字(必须包含所有数字)
[1 | 2 | 3 | 4 | 5]
0 1 2 3 4
现在,一个元素被重置并设置为 0 ,任务是找到它在0变为之前的数字。
所以我有这个简单的解决方案:
解释:首先,从1到5循环,创建一个内部循环来检查整个数组中是否存在第一个循环的i
,如果它不存在,这意味着它是0之前的值,因为数组包含从1到5或1到100的所有数字(无关紧要),并且有一个休息元素。
代码:
int[] numbers = new int[]{1, 2, 3, 4, 5};
numbers[1] = 0;
int lost = -1;
loop:
for (int i = 1; i <= numbers.length; i++) {
for (int j = 0; j < numbers.length; j++) {
if (numbers[j] == i) {
continue loop;
}
}
lost = i;
break loop;
}
System.out.println(lost);
这个解决方案并不坏,但我认为有更好的解决方案,更稳定。
在我们的例子中,我在数学上考虑过它:
1 + x + 3 + 4 + 5 = 15
x = 2
数学上,这很容易。有没有一种方法可以在编程语言中完成,就像在数学上一样简单? 你能想到什么更好的算法来解决这个问题?
答案 0 :(得分:2)
这适用于重置的一个元素。只需从总和中减去每个剩余的元素,剩下的就是元素在重置之前的前一个数字。
for (int i = 0; i < row; ++i)
for (int j = 0; j < col; ++j)
matrix[i][j] = B.matrix[i][j];
结果:
5
答案 1 :(得分:0)
还有一种可能性,你可以使用HashMaps! 你不必遍历任何“for loops”。
您可以使用Hashmaps检查“0”键是否有任何值,如果是,则将某个数字重置为0。 然后,您可以遍历Hashmap并比较缺少的值。
一切都完成O(1)复杂性和O(n)复杂性的最坏情况。