KN数组
题目描述
在一个数组中, 有一个数出现K次, 其他数出现M次, 请你求出 出现K次的数是哪一个;
你的任务是完成solution方法的编写, 其中arr为数组, k, m意思如上, 你需要返回出现k次的数。
输入样例
- input①
K=1, M=3, arr[-1, 3, 3, 3, 5, 5, 5, 8, 8, 8, 4, 4, 4]
输出样例
- outpu①
-1
对数器
package chapter3;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map.Entry;
import java.util.Arrays;
public class code3 {
public static int solution(int[] arr, int k, int m) {
}
// for test
public static int correctWay(int[] arr, int k, int m) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < arr.length; i++) {
map.put(arr[i], map.get(arr[i]) == null ? 1 : map.get(arr[i]) + 1);
}
for (Entry<Integer, Integer> i : map.entrySet()) {
if (i.getValue() == k)
return i.getKey();
}
return -1;
}
public static int[] getRandomArray(int maxKinds, int maxValue, int k, int m) {
int[] resArray = new int[k + (maxKinds - 1) * m];
HashSet<Integer> set = new HashSet<>(); // 避免重复
// 放1个出现k次的数
int numk = getRandomNumber(maxValue);
set.add(numk);
int index = 0;
for (int i = 0; i < k; i++)
resArray[index++] = numk;
// 放maxKinds-1个出现m次的数
for (int i = 0; i < maxKinds - 1; i++) {
int x;
do {
x = getRandomNumber(maxValue);
} while (set.contains(x));
set.add(x);
for (int j = 0; j < m; j++)
resArray[index++] = x;
}
// 打乱数组
int randomTimes = 100; // 打乱100次数组
while (randomTimes-- > 0) {
int i = (int) (Math.random() * resArray.length);
int j = (int) (Math.random() * resArray.length);
swap(resArray, i, j);
}
return resArray;
}
public static int getRandomNumber(int maxValue) {
return (int) (Math.random() * maxValue) - (int) (Math.random() * maxValue);
}
public static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
/* 一个数组中, 有一个数出现k次,其他数都出现M次, 求出现k次的这个数 */
public static void main(String[] args) {
int maxKinds = 10;
int maxValue = 100;
int maxTimes = 10;
int runTimes = 100000;
// 求k和M
int x1 = (int) Math.random() * maxTimes + 1;
int x2 = (int) Math.random() * maxTimes + 1;
int k = Math.min(x1, x2), m = Math.max(x1, x2);
if (k == m)
m++;
// run
System.out.println("Test begin!");
for (int i = 0; i < runTimes; i++) {
int[] arr = getRandomArray(maxKinds, maxValue, k, m);
int ans1 = correctWay(arr, k, m);
int ans2 = solution(arr, k, m);
if (ans1 != ans2) {
System.out.println("error");
System.out.println("ans1:"+ans1+" "+"ans2"+ans2);
System.out.println(k + " " + m);
System.out.println(Arrays.toString(arr));
break;
}
}
System.out.println("Test over!");
}
}