zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    UVALive 6909 Kevin's Problem 数学排列组合
    UVALive 6908 Electric Bike dp
    UVALive 6907 Body Building tarjan
    UVALive 6906 Cluster Analysis 并查集
    八月微博
    hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形
    hdu 5792 World is Exploding 树状数组
    hdu 5791 Two dp
    hdu 5787 K-wolf Number 数位dp
    hdu 5783 Divide the Sequence 贪心
  • 原文地址:https://www.cnblogs.com/AntonioSu/p/11855180.html
Copyright © 2011-2022 走看看