我在面试中被问到这个问题,给定一个数字列表,只返回输入中存在的重复数字作为排序后的输出。
例如:
我想出了以下的解决方案:
方法1:
更新方法2:
旧方法2
方法1的时间复杂度为(n)Log(n),因为在Java中排序是nlogn,空间复杂度为n。
方法2的时间复杂度再次为(n)Log(n),因为在Java中排序是nlogn,空间复杂度比方法1少一些,因为我只在集合中保存元素一次。
如果我在找出时间和空间复杂度方面有错误,请纠正我。
现在的问题是,如果输入包含数百万个数字,这种逻辑是否有效?如果输入是数百万个数字,HashMap是否有效?
据我所知,通常情况下,映射或集合的时间复杂度较低,而HashSet的内部实现使用HashMap。如何回答这个问题?
例如:
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是否有效?
据我所知,通常情况下,映射或集合的时间复杂度较低,而HashSet的内部实现使用HashMap。如何回答这个问题?
{1,1,1}
将返回一个列表1, 1
。 - Nexevis