剑指 Offer II 004. 只出现一次的数字

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

 

posted @ 2022-03-28 08:57  WTSRUVF  阅读(14)  评论(0编辑  收藏  举报