题意:

image.png

解题思路:

  1. 思路:
  2. 1. 取巧的计算方式将数转化成二进制的数, 统计每个位上1出现的个数;
  3. 2. 个数模3就可得到出现一次的数在当前位上的情况。
  4. 1 1 1 1 => 15
  5. 1 1 0 1 => 13
  6. 1 1 1 1 => 15
  7. 1 1 1 1 => 15
  8. ------------------
  9. 4 4 3 4 / 3 将每一位数除3 取余 得出只有一位数的对应位的二进制数
  10. ------------------
  11. 1 1 0 1 => 13

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer[] $nums
  4. * @return Integer
  5. */
  6. function singleNumber($nums) {
  7. $ans = 0;
  8. //考虑每一位
  9. for ($i = 0; $i < 64; $i++) {
  10. $count = 0;
  11. //考虑每一个数
  12. for ($j = 0; $j < count($nums); $j++) {
  13. //当前位是否是 1
  14. if (($nums[$j] >> $i & 1) == 1) {
  15. $count++;
  16. }
  17. }
  18. //1 的个数是否是 3 的倍数
  19. if ($count % 3 != 0) {
  20. $ans = $ans | 1 << $i;
  21. }
  22. }
  23. return $ans;
  24. }
  25. function singleNumber1($nums) {
  26. $map = [];
  27. for ($i = 0; $i < count($nums); $i++) {
  28. $map[$nums[$i]]++;
  29. }
  30. foreach ($map as $k => $v) {
  31. if ($v == 1) return $k;
  32. }
  33. return 0;
  34. }
  35. }

GO代码实现:

  1. func singleNumber(nums []int) int {
  2. ans := 0
  3. for i:= 0; i < 64; i++ {
  4. number := 0
  5. for _, v := range nums {
  6. number += v >> i & 1
  7. }
  8. ans |= (number % 3) << i
  9. }
  10. return ans
  11. }
  12. func singleNumber(nums []int) int {
  13. var ans int32
  14. var i uint
  15. for ; i < 32; i++ {
  16. //逐位考虑
  17. var cnt uint
  18. for k := 0; k < len(nums); k++ {
  19. //统计这一位出现1的次数
  20. cnt += (uint(nums[k]) >> i) & 1
  21. }
  22. if cnt % 3 != 0 { //这一位的1出现非3次
  23. ans = ans | (1 << i) //把这一位记到结果的相应位
  24. }
  25. }
  26. return int(ans) // 返回32位完整的结果
  27. }