题意:
解题思路:
思路:
1. 取巧的计算方式将数转化成二进制的数, 统计每个位上1出现的个数;
2. 个数模3就可得到出现一次的数在当前位上的情况。
1 1 1 1 => 15
1 1 0 1 => 13
1 1 1 1 => 15
1 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位完整的结果
}