LeetCode Single Number I / II / III

【1】LeetCode 136 Single Numberspa

题意:奇数个数,其中除了一个数只出现一次外,其余数都是成对出现,好比1,2,2,3,3...,求出该单个数。code

解法:容易想到异或的性质,两个相同的数异或为0,那么把这串数从头至尾异或起来,最后的数就是要求的那个数。blog

代码以下:it

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int sum = 0;
        for(int i=0;i<nums.size();i++) 
            sum ^= nums[i];
        return sum;
    }
};

【2】LeetCode 137 Single Number IIio

题意:给一串数,除了一个数只出现一次外,其余数都出现了三次。求那个单个数。ast

解法:仍是从位操做上考虑,把每一个数写成二进制列出来,每位对齐,能够发现,每一位上的1的个数要么是3的倍数,要么是3的倍数+1,那么把每一位的1个数加起来,模3便可的单个数的该位为0仍是为1。class

代码以下:二进制

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        for(int i=0;i<32;i++) {
            int dream = (1<<i), cnt = 0;
            for(int j=0;j<nums.size();j++)
                cnt += (bool)(nums[j] & dream);
            cnt = cnt % 3;
            ans ^= (cnt << i);
        }
        return ans;
    }
};

【3】LeetCode 260 Single Number IIIdi

题意:有一串数字,其中有两个不一样的数,各出现一次,其余的数都出现2次。找出这两个数。co

解法:看到其余数出现两次,又想到异或操做,若是所有异或起来,获得的是那两个数的异或。既然是两个不一样的数,那么异或的二进制里面必然是有1的,咱们先找出这个1,而后逐个检查,若是这位有1,那么异或到a,不然异或到b,最后的a,b便是这两个值。找1能够找最后一个1,x&(-x)便可。

代码以下:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int xorsum = 0;
        for(int i=0;i<nums.size();i++) xorsum ^= nums[i];
        int lastdifferentbit = xorsum & (-xorsum);
        int a = 0, b = 0;
        for(int i=0;i<nums.size();i++) {
            if(nums[i] & lastdifferentbit) a ^= nums[i];
            else b ^= nums[i];
        }
        return vector<int>{a,b};
    }
};
相关文章
相关标签/搜索