剑指 Offer 56 - II. 数组中数字出现的次数 II

image.png

巧用二进制 + int 数组

执行用时:7 ms, 在所有 Java 提交中击败了66.18% 的用户 内存消耗:39.5 MB, 在所有 Java 提交中击败了40.31% 的用户

  1. class Solution {
  2. /**
  3. * 以用例 {3, 4, 3, 3} 为例子
  4. *
  5. * 把 nums 内的整数拆分为二进制累加到 bits 数组中
  6. * 3 的二进制:011
  7. * 4 的二进制:100
  8. * 累加之后 bits 结果:[..., 1, 3, 3]
  9. *
  10. * 再将 bits 内的元素对 3 取余后转换为十进制
  11. */
  12. public int singleNumber(int[] nums) {
  13. int[] bits = new int[32];
  14. // 把 nums 内的整数拆分为二进制累加到 bits 数组中
  15. for (int num : nums) {
  16. for (int i = 31; i >= 0; i--) {
  17. if (num != 0) {
  18. bits[i] += (num & 1);
  19. num >>= 1;
  20. }
  21. }
  22. }
  23. // 将二进制转为十进制
  24. int res = 0;
  25. for (int i = 0; i < 32; i++) {
  26. res <<= 1;
  27. res += bits[i] % 3;
  28. }
  29. return res;
  30. }
  31. }