【发布时间】:2015-03-24 13:31:07
【问题描述】:
问题:从两个给定数组(不是排序数组)中找到不重复的项目。如果第一个数组是 {1, 2, 3} 而第二个数组有 {2, 3, 4} 那么结果应该是 {1,4}。
我做了什么:我通过使用 Set 实现了它。但似乎 O(n2)。
我需要什么:是否有任何其他算法可以编写得更优化?
我的代码:
package src;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.TreeSet;
public class GetNonDuplicate {
public static void main(String[] args) {
Integer[] arrayOne = {1, 2, 3};
Integer[] arrayTwo = {2, 3, 4};
List<Integer> resultList = new ArrayList<Integer>();
List<Integer> listOfArrayOne = new ArrayList<Integer>(Arrays.asList(arrayOne));
TreeSet<Integer> setOne = new TreeSet<Integer>(listOfArrayOne);
System.out.println("SetOne is : " + setOne);
for (Integer elem2 : arrayTwo) {
boolean exists = setOne.add(elem2);
System.out.println("For elem2 [" + elem2 + "], exists [" + exists + "]." );
if (exists) {
resultList.add(elem2);
}
}
System.out.println(resultList);
List<Integer> listOfArrayTwo = new ArrayList<Integer>(Arrays.asList(arrayTwo));
TreeSet<Integer> setTwo = new TreeSet<Integer>(listOfArrayTwo);
System.out.println("setTwo is : " + setTwo);
for (Integer elem1 : arrayOne) {
boolean exists = setTwo.add(elem1);
System.out.println("For elem2 [" + elem1 + "], exists [" + exists + "]." );
if (exists) {
resultList.add(elem1);
}
}
System.out.println(resultList);
}
}
【问题讨论】:
-
数组是否像您的示例一样在开始时排序?
-
看起来你想要两个数组元素的对称差异。如果这是问题所在,请在此处查看:stackoverflow.com/q/8064570/1065197
-
对两个数组进行排序并使用 2 个指针(每个数组一个指针)对它们进行迭代是在 O(nlogn) 时间和 O(1) 空间中执行此操作的一种方法。使用 O(n) 空间和 O(n) 时间,您可以创建一个
Map<Integer, Integer>来计算每个数字的所有出现次数,然后打印计数为 1 的数字。 -
感谢 Mateusz Dymczyk 的好主意 :)
-
您好,虽然我的示例看起来已排序,但根据问题陈述应该未排序。这就是为什么我想使用 TreSet 而不是 HashSet。