【问题标题】:Algorithm: find the missing element from 2 given arrays, second array is duplicate算法:从 2 个给定数组中找到缺失的元素,第二个数组是重复的
【发布时间】:2016-05-10 16:04:32
【问题描述】:

从给定的 2 个数组中查找缺失的元素,第二个数组是重复的。

示例: 数组 1:[1,2,3,4,5,6,7] 数组 2:[1,3,4,5,6,7]

我阅读了有关使用哈希图和其他复杂方法的信息,但我认为最好的解决方案是:

1) 将array1和array2的所有元素分别相加,得到sum1和sum2,则答案是|sum2 - sum1|

2) 对array1 和array2 的所有元素分别进行异或运算,得到xor1 和xor2。这里 xor1 总是来自完整的数组。缺少的元素将是 xor2 XOR xor1(来自 XOR 应用程序http://www.codeproject.com/Articles/2983/XOR-tricks-for-RAID-data-protection

编辑:数组未排序

我说的对吗?

【问题讨论】:

  • 数组总是排序的?
  • 数组总是包含整数吗?
  • @Joni 是的,总是整数
  • I believe the best solution is; Am I correct? 没有质量衡量标准/best,我看不出有什么办法。然后,我认为您不需要查看您的方法所做的 O(n) 元素。 (哦,请说明第二个数组中的元素是否与第一个数组中的元素顺序相同。)
  • @greybeard 的顺序不同。如果没有 O(n),你会怎么做?

标签: algorithm


【解决方案1】:

如果数字很大,第一个答案可能会导致整数溢出。

从各个方面来看,第二个选项都更好。此外,第一个数组不必是包含的数组。您可以从第一个数组的开头开始异或,直到第二个数组的最后一个元素。您最终将得到两个数组联合中的唯一元素。它的成本为 O(n) 复杂度。

【讨论】:

  • 我喜欢这个答案,因为它是面试官可能正在寻找的
  • 谢谢,其实我是在准备面试的时候知道的:)
【解决方案2】:

是的,假设数组包含整数,您的算法是正确的。证明很容易从x^x=0if and only ifx=x这一事实得出。它甚至适用于数组包含重复项的情况。

证明草图。 设 A 是一个由 n 个整数组成的数组,设 B 是 A 的一个副本,其中一个元素被删除。定义xorA := A[0] ^ A[1] ^ ... ^ A[n-1]xorB := B[0] ^ ... ^ B[n-2]。由于每个元素,除了缺失的元素,出现 even 次,xorA ^ xorB 将等于出现 odd 次的缺失元素---所有其他元素都抵消因为x^x=0

【讨论】:

  • 谢谢!我很高兴我能提供帮助。 :-)
【解决方案3】:

我编码用于过滤包含具有多个频率的项目的数组的缺失数字。但是大小 10^5 超出了时间限制。感谢任何降低时间复杂度的逻辑。

// 缺少数字

// Write your code here
 public static List<Integer> missingNumbers(List<Integer> arr,List<Integer> brr){
Collections.sort(arr);
Collections.sort(brr);
Set<Integer> list = new HashSet<>();
for(int s:brr){
   if(arr.contains(s)){
       if(Collections.frequency(arr,s)!=Collections.frequency(brr,s)){
           list.add(s);
       }
   }
   else{
       list.add(s);
   }
}
ArrayList<Integer> list1= new ArrayList<>(list);
Collections.sort(list1);
return list1;
}

【讨论】:

    猜你喜欢
    • 2015-11-24
    • 2021-08-25
    • 2017-09-22
    • 2015-01-08
    • 1970-01-01
    • 2011-06-19
    • 2017-01-20
    • 1970-01-01
    • 2016-07-27
    相关资源
    最近更新 更多