map就可以
O(n) 不适用额外空间:
int有32位,求每一位的二进制的累加和
因为除了那个特殊数,其他数都出现三次
那么只要一个数x,二进制的某一位为1,这一位就是 += 3
最后将结果%3,就是特殊数在这个位上的数
不适用额外的空间:
外层循环是32
内层遍历nums
提一句:
其实这样的话都可以,这类出现几次的数的题都可以用这种方法解
不过出席那偶数次的可以把所有的数异或一遍就行
同假异真
class Solution { public: int singleNumber(vector<int>& nums) { int ret = 0; int len = nums.size(); for(int i = 1; i <= 32; i++) { int temp = 0; for(int j = 0; j < len; j++ ) { temp += (nums[j] >> (32 - i)) & 1; } temp %= 3; ret <<= 1; ret += temp; } return ret; } };
map
class Solution(object): def singleNumber(self, nums): """ :type nums: List[int] :rtype: int """ dic = {} for num in nums: dic[str(num)] = 0 for num in nums: dic[str(num)] += 1 for num in nums: if(dic[str(num)] == 1): return num