Java 从两个列表中查找缺少的编号
问题:假设我们有两个包含相同数字的未知整数列表。但是,其中一个列表缺少一个数字。找到丢失的号码最有效的方法是什么 我的方法:为循环嵌套如下:Java 从两个列表中查找缺少的编号,java,Java,问题:假设我们有两个包含相同数字的未知整数列表。但是,其中一个列表缺少一个数字。找到丢失的号码最有效的方法是什么 我的方法:为循环嵌套如下: public int findMissing(int [] list1,int [] list2){ for(int i =0; i < list1.length(); i++){ for(int j=0; j < list2.length(); j++){ if(list1[i] != list2[j]
public int findMissing(int [] list1,int [] list2){
for(int i =0; i < list1.length(); i++){
for(int j=0; j < list2.length(); j++){
if(list1[i] != list2[j] && j == list2.length()-1)
return list2[j];
}
}
return;
public int findMissing(int[]list1,int[]list2){
对于(int i=0;i
解释将第二个列表中的每个项目与第一个列表中的每个项目进行比较。如果您在循环结束时到达的位置与第一个列表中缺少第二个列表中的数字,则返回该数字
让我知道是否有更好的方法。在运行时间方面更好。(列表1中所有数字的总和)-(列表2中所有数字的总和)=您要查找的数字
这是假设第一个列表是包含附加数字的列表,否则返回该数字的负值。如果列表应该相同,您可以对它们进行排序。这样您就不需要嵌套循环。您可以在同一位置检查两个列表,并且它们应该相等。如果不是,则其中一个列表不同ent(取决于您认为正确的列表)。此时运行时将是线性的,以检查整个列表。一个比两个列表相加(可能导致溢出)更好的解决方案是对列表进行异或运算,并将结果异或运算在一起。此解决方案以线性时间运行,并且不会溢出。
下面是一些代码来证明这一点
public class Main {
public static int missingno(int[]first,int[]second) {
int xor_val = 0;
for (int i : first)
xor_val ^= i;
for (int i : second)
xor_val ^= i;
return xor_val;
}
public static void main(String[] args) {
int[]a= {1,2,3,4,5,6,7,8};
int[]b = {5,4,6,8,3,2,1};
System.out.println(missingno(b,a));
}
}
记住,xor是一个非常通用的运算符。它是可交换和关联的,可以用来交换变量,而无需临时变量
我还想指出,另一个解决方案是维护hashmap(初始化为列表中不能包含的数字)查看1-短列表,将每个值标记为存在,然后查看完整列表。如果遇到未设置的值,您已找到缺少的元素。这样做的好处是它会立即告诉您缺少元素的索引。列表的顺序相同吗?对于小列表,您可以忽略此项。But随着列表大小的增长,这将无法扩展。一个问题:数组中的所有元素都是唯一的吗?元素的顺序是否重要?是否要知道列表中的哪个元素不同,或者它们在位置上不同?元素不是唯一的,元素的顺序也不重要。这不适用于以下列表:[1 1], [1 2],在这种情况下,2仅在一个列表中,而不在other@bengoesboom-是的,但我理解这个问题的方式是一个列表有一个额外的数字。@bengoesboom您的示例不正确。列表中的一个缺少一个元素!因此它们不能有相同的大小!我认为解决方案是正确的。@Tomerazy当问到这个问题时,它是正确的不清楚。为了安全起见,我会给出一个正确处理这些情况的解决方案。至于负数问题,这很容易。获取两个数组的大小,len1和len2;计算完成后,如果len1大于len2,则结果是计算结果,否则减去该数。+1可以说不能得到任何快速结果里文基尔斯马科斯很遗憾,它不会引起其他答案的注意,我实际上是在一次采访中得到的。你来晚了,但热心的读者可能仍然会选择(投票)稍微简化一下:你不需要两个总数,只需将两个列表中的所有值进行异或运算……结果就是缺少的数字。@JimBalter Smart没有注意到,异或运算肯定是最低估的运算