📌  相关文章
📜  打印所有出现超过 N K 次的数组元素(1)

📅  最后修改于: 2023-12-03 15:25:45.759000             🧑  作者: Mango

打印所有出现超过 N K次的数组元素

在大多数情况下,我们需要对数组的元素进行操作。有时我们需要打印所有出现超过N次的数组元素。这个过程可以使用以下几种方式来实现。

遍历并使用HashMap

这是一种最基本的方法,我们只需要遍历整个数组,并使用一个HashMap来记录每个元素出现的次数。一旦我们完成了检查过程,就可以再次遍历HashMap并查找每个元素是否出现了N次。

public static void printRepeatedElement(int arr[], int N, int K) {
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int i = 0; i < arr.length; i++) {
        Integer count = map.get(arr[i]);
        if (count == null) {
            count = 0;
        }
        map.put(arr[i], count + 1);
    }
    for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
        if (entry.getValue() > N && entry.getValue() < K) {
            System.out.println(entry.getKey());
        }
    }
}

这个方法的时间复杂度为O(n),但是需要使用一个额外的空间来存储HashMap。

排序并使用指针

我们也可以将数组排序,然后使用指针来查找重复的元素。这个方法不需要额外的空间。它的时间复杂度为O(nlogn),因为需要进行排序操作。

public static void printRepeatedElement(int arr[], int N, int K) {
    Arrays.sort(arr);
    int count = 1;
    int prevElement = arr[0];
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] == prevElement) {
            count++;
        } else {
            if (count > N && count < K) {
                System.out.println(prevElement);
            }
            prevElement = arr[i];
            count = 1;
        }
    }
    if (count > N && count < K) {
        System.out.println(prevElement);
    }
}
使用位运算和数组

这是最优解,它需要使用位运算和数组来实现。我们用一个32位整数的数组cnt[],用来表示数组元素出现的个数。cnt[i]的值更新的时候将第i位置1即可。最后再遍历一遍数组即可找出大于N且小于K的元素。这个方法的时间复杂度为O(n)。

public static void printRepeatedElement(int arr[], int N, int K) {
    int[] cnt = new int[32];
    for (int i = 0; i < arr.length; i++) {
        int elem = arr[i];
        while (elem > 0) {
            cnt[elem & 31]++;
            elem >>= 5;
        }
    }
    for (int i = 0; i < cnt.length; i++) {
        if (cnt[i] > N && cnt[i] < K) {
            System.out.println(i);
        }
    }
}

以上是三种不同的方法来打印所有出现超过N次的数组元素,我们可以根据自己的需求来选择一种适合的方法。