题意:
解题思路:
思路:1. 取巧的计算方式将数转化成二进制的数, 统计每个位上1出现的个数;2. 个数模3就可得到出现一次的数在当前位上的情况。1 1 1 1 => 151 1 0 1 => 131 1 1 1 => 151 1 1 1 => 15------------------4 4 3 4 / 3 将每一位数除3 取余 得出只有一位数的对应位的二进制数 ------------------1 1 0 1 => 13
PHP代码实现:
class Solution { /** * @param Integer[] $nums * @return Integer */ function singleNumber($nums) { $ans = 0; //考虑每一位 for ($i = 0; $i < 64; $i++) { $count = 0; //考虑每一个数 for ($j = 0; $j < count($nums); $j++) { //当前位是否是 1 if (($nums[$j] >> $i & 1) == 1) { $count++; } } //1 的个数是否是 3 的倍数 if ($count % 3 != 0) { $ans = $ans | 1 << $i; } } return $ans; } function singleNumber1($nums) { $map = []; for ($i = 0; $i < count($nums); $i++) { $map[$nums[$i]]++; } foreach ($map as $k => $v) { if ($v == 1) return $k; } return 0; }}
GO代码实现:
func singleNumber(nums []int) int { ans := 0 for i:= 0; i < 64; i++ { number := 0 for _, v := range nums { number += v >> i & 1 } ans |= (number % 3) << i } return ans}func singleNumber(nums []int) int { var ans int32 var i uint for ; i < 32; i++ { //逐位考虑 var cnt uint for k := 0; k < len(nums); k++ { //统计这一位出现1的次数 cnt += (uint(nums[k]) >> i) & 1 } if cnt % 3 != 0 { //这一位的1出现非3次 ans = ans | (1 << i) //把这一位记到结果的相应位 } } return int(ans) // 返回32位完整的结果}