/*

  • 已知数组中其他数都出现了N次,只有一种数出现了K次
  • 怎么找到出现了K次的数?做到时间复杂度O(N),额外空间复杂度O(1)
  • 规定:N > 1,K > 0,K < N

  • */

    image.png

    二进制

    image.png

  • 搞一个数组,

  • (每位 % N) / k

举例子
image.png
image.png

  1. public class _补充题_KN {
  2. // 右额外空间复杂度
  3. public static int get1(int[] arr, int k, int n) {
  4. HashMap<Integer, Integer> map = new HashMap<>();
  5. for (int num : arr) {
  6. if (!map.containsKey(num)) {
  7. map.put(num, 1);
  8. } else {
  9. map.put(num, map.get(num) + 1);
  10. }
  11. }
  12. for (Integer key : map.keySet()) {
  13. if (map.get(key) == k) {
  14. return key;
  15. }
  16. }
  17. return -1;
  18. }
  19. // 时间复杂度O(N),额外空间复杂度O(1)
  20. public static int get2(int[] arr, int k, int n) {
  21. int[] count = new int[32];
  22. for (int num : arr) {
  23. for (int i = 0; i < 32; i++) {
  24. if ((num & (1 << i)) != 0) {
  25. count[i]++;
  26. }
  27. }
  28. }
  29. for (int i = 0; i < count.length; i++) {
  30. count[i] = (count[i] % n) / k;
  31. }
  32. int ans = 0;
  33. for (int i = 0; i < count.length; i++) {
  34. ans |= count[i] << i;
  35. }
  36. return ans;
  37. }
  38. }