KN_数组

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!");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值