int[] a = new int[10]{1,2,3,4,5,6,7,7,7,7};
我怎样才能写一个方法并返回 7?
我想在没有列表、地图或其他助手的帮助下保持原生。只有数组[]。
原文由 SexyMF 发布,翻译遵循 CC BY-SA 4.0 许可协议
int[] a = new int[10]{1,2,3,4,5,6,7,7,7,7};
我怎样才能写一个方法并返回 7?
我想在没有列表、地图或其他助手的帮助下保持原生。只有数组[]。
原文由 SexyMF 发布,翻译遵循 CC BY-SA 4.0 许可协议
试试这个答案。一、数据:
int[] a = {1,2,3,4,5,6,7,7,7,7};
在这里,我们构建了一个地图来计算每个数字出现的次数:
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i : a) {
Integer count = map.get(i);
map.put(i, count != null ? count+1 : 1);
}
现在,我们找到频率最高的数字并将其返回:
Integer popular = Collections.max(map.entrySet(),
new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
return o1.getValue().compareTo(o2.getValue());
}
}).getKey();
如您所见,最受欢迎的数字是七:
System.out.println(popular);
> 7
编辑
这是我的答案 ,不 使用地图、列表等,只使用数组;尽管我正在对数组进行就地排序。它的复杂度为 O(n log n),优于 O(n^2) 公认的解决方案。
public int findPopular(int[] a) {
if (a == null || a.length == 0)
return 0;
Arrays.sort(a);
int previous = a[0];
int popular = a[0];
int count = 1;
int maxCount = 1;
for (int i = 1; i < a.length; i++) {
if (a[i] == previous)
count++;
else {
if (count > maxCount) {
popular = a[i-1];
maxCount = count;
}
previous = a[i];
count = 1;
}
}
return count > maxCount ? a[a.length-1] : popular;
}
原文由 Óscar López 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.3k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
1 回答2.1k 阅读✓ 已解决