查找 int[] 数组中最受欢迎的元素

2022-09-01 01:41:19
int[] a = new int[10]{1,2,3,4,5,6,7,7,7,7};

如何编写方法并返回7?

我想在没有列表,地图或其他助手帮助的情况下保持本机。仅数组 []。


答案 1

试试这个答案。一、数据:

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;

}

答案 2
public int getPopularElement(int[] a)
{
  int count = 1, tempCount;
  int popular = a[0];
  int temp = 0;
  for (int i = 0; i < (a.length - 1); i++)
  {
    temp = a[i];
    tempCount = 0;
    for (int j = 1; j < a.length; j++)
    {
      if (temp == a[j])
        tempCount++;
    }
    if (tempCount > count)
    {
      popular = temp;
      count = tempCount;
    }
  }
  return popular;
}