📅  最后修改于: 2023-12-03 15:25:45.759000             🧑  作者: Mango
在大多数情况下,我们需要对数组的元素进行操作。有时我们需要打印所有出现超过N次的数组元素。这个过程可以使用以下几种方式来实现。
这是一种最基本的方法,我们只需要遍历整个数组,并使用一个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次的数组元素,我们可以根据自己的需求来选择一种适合的方法。