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;
        }
    };
  • 相关阅读:
    SqlServer数据库同步方案详解(包括跨网段)
    makefile 和shell文件相互调用
    处理百万级以上的数据处理
    makefile Template(添加多个lib)
    Linux下如何删除非空目录
    makefile Template
    g++ 编译和链接
    gcc include路径
    C++ XML解析之TinyXML篇
    利用Lucene.net搭建站内搜索(2)分词技术
  • 原文地址:https://www.cnblogs.com/AntonioSu/p/11855180.html
Copyright © 2011-2022 走看看