【发布时间】:2019-10-11 20:06:46
【问题描述】:
我在一次采访中被问到这个问题,给定一个数字列表,只返回输入中存在的重复项作为排序输出。
示例:
Input = [6, 7, 5, 6, 1, 0, 1, 0, 5, 3, 2]
Output = [0, 1, 5, 6] - sorted unique numbers which are duplicates in input
我想出了以下解决方案:
方法1:
public static List<Integer> process(List<Integer> input) {
List<Integer> result = new ArrayList<>();
Map<Integer, Integer> map = new HashMap<>();
for (int val : input) {
map.put(val, map.getOrDefault(val, 0) + 1);
}
map.forEach((key, val) -> {
if (val > 1) {
result.add(key);
}
});
result.sort(null);
return result;
}
更新方法2:
public static List<Integer> process1(List<Integer> input) {
Set<Integer> dups = new HashSet<>();
Set<Integer> set = new HashSet<>();
for (int val : input) {
if (set.contains(val)) {
dups.add(val);
} else {
set.add(val);
}
}
List<Integer> result = new ArrayList<>(dups);
result.sort(null);
return result;
}
旧方法2
public static List<Integer> process1(List<Integer> input) {
List<Integer> result = new ArrayList<>();
Set<Integer> set = new HashSet<>();
for (int val : input) {
if (set.contains(val)) {
result.add(val);
} else {
set.add(val);
}
}
result.sort(null);
return result;
}
方法1的时间复杂度是(n)Log(n),因为java中的排序是nlogn,空间复杂度是n
方法 2 的时间复杂度再次为 (n)Log(n),因为在 java 中的排序是 nlogn,空间复杂度与方法 1 相比略低,因为我在我的集合中只保存一次元素。
如果我在找出时间和空间复杂性方面有误,请纠正我。
现在的问题是,如果输入包含数百万个数字,这个逻辑是否有效?如果输入是百万个数字,HashMap 是否有效?
根据我的一般理解,map 或 set 的时间复杂度较低,HashSet 内部实现也使用 HashMap。如何回答这个问题。
【问题讨论】:
-
我运行了你的两种方法,看起来 Approach1 有效,但 Approach2 返回了不正确的结果(它在列表中有多个相同的数字)。请注意,我在大小为 10 的简单列表上运行了这些。
-
@Nexevis,你能分享一下输入数据吗
-
当您有至少 3 个相同的输入时,它会中断,例如
{1,1,1}将返回1, 1的列表 -
@Nexevis,谢谢,我已经更新了代码
标签: java