LeetCode 二进制问题

338. Counting Bits(计算小于n的各个数值对应的二进制1的个数)

思路:通过奇偶判断,if i是偶数,a[i]=a[i/2],if i是奇数,a[i]=a[i-1]+1。

class Solution {
public:
    vector<int> countBits(int num) {
        vector<int>res(num+1, 0);

        for(int i=1;i<=num;i++)
        {
            if(i&1)
                res[i] = res[i-1]+1;//如果尾数为1,那么结果就是奇数,等于前一个值加1
            else
                res[i] = res[i/2];//如果尾数为0,那么就是偶数,等于他一半的值
        }
        return res;
    }
};

136. Single Number(只有一个元素出现1次,其他出现2次,寻找只出现一次的数值)

思路:异或 解决,异或性质: x^x=0,x^0=x

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

137. Single Number II (只有一个元素出现1次,其他出现3次,寻找只出现一次的数值);

思路:按照位运算,每个位置是上1的个数为3,则变0

 class Solution {
 public:
     int singleNumber(vector<int>& nums) {
         int n = nums.size(),answer=0;
         for (int j = 0; j < 32; j++)
         {
             int a = 1<<j,count=0;//count 记录每个位置上1的个数
             for (int i = 0; i < n; i++)
             {
                 if (a&nums[i]) count++;//统计转化为二进制之后,在a的位置上1的个数
             }
             if (count % 3 != 0)//如果每个位置上的1不为3,则最后的数字中,这个位置中一定是1
                 answer |= a;
         }
         return answer;
     }
 };

260. Single Number III(有两个元素出现1次,其他出现2次,寻找两个出现一次的数值);

思路:整体异或结果,而后在这个结果中某个位置为1的位置,进而分割成两个部分,分别异或,者可得到结果

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int n = nums.size();
        vector<int> vec;
        int res=0;
        for (int i = 0; i < n; i++)
        {
            res ^= nums[i];
        }
        int index = 0;//记录异或的结果第一个为1的位置,0表示第一个位置为1
        for (int i = 0; i < 32; i++)
        {
            if (res & 1 == 1)
                break;
            index++;
            res = res >> 1;
        }
        int num1=0, num2 = 0;
        for (int i = 0; i < n; i++)
        {
            if ((nums[i] >> index) & 1 == 1)//以index位置将述组分为两段异或
                num1 ^= nums[i];
            else
                num2 ^= nums[i];
        }
        vec.push_back(num1);
        vec.push_back(num2);
        return vec;
    }
};

猜你喜欢

转载自www.cnblogs.com/AntonioSu/p/11855180.html