• c++入门99题21-30


    解题报告

    1.力扣476

    原题链接

    476. 数字的补数

    源码剖析

    class Solution {
    public:
        int findComplement(int num) {
            if(num==0) return 1;
            long n = 1;
            while(n<=num){
                n<<=1;
            }
            return (n-1)^num;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.力扣剑指 Offer 15. 二进制中1的个数

    原题链接

    剑指 Offer 15. 二进制中1的个数

    源码剖析

    法一:

    class Solution {
    public:
        int hammingWeight(uint32_t n) {
            int ans=0;
            while(n>0){
                ans+=n&1;
                n=n>>1;
            }
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    计算一位就右移一位,使用 & 来判断是否当前位为 1
    法二:

    class Solution {
    public:
        int hammingWeight(uint32_t n) {
            int ans = 0;
            while(n){
                n&=(n-1);
                ans++;
            }
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    使用位与来消除最末位的 1

    3.力扣191

    原题链接

    191. 位1的个数

    源码剖析

    class Solution {
    public:
        int hammingWeight(uint32_t n) {
            int ans = 0;
            while(n){
                n&=(n-1);
                ans++;
            }
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    同上。

    4.力扣461

    原题链接

    461. 汉明距离

    源码剖析

    class Solution {
        int cal(int n){
            int ans = 0;
            while(n){
                n&=(n-1);
                ans++;
            }
            return ans;
        }
    public:
        int hammingDistance(int x, int y) {
            return cal(x^y);
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    仍然同上,先异或两个数然后再求位 1 个数即可。

    解题报告

    5.力扣2220

    原题链接

    2220. 转换数字的最少位翻转次数

    源码剖析

    class Solution {
        int cal(int n){
            int ans = 0;
            while(n){
                n&=(n-1);
                ans++;
            }
            return ans;
        }
    public:
        int minBitFlips(int start, int goal) {
            return cal(start^goal);
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    其实这题和上一题是一样的,翻转只需要翻转不同的位即可。

    6.力扣1342

    原题链接

    1342. 将数字变成 0 的操作次数

    源码剖析

    class Solution {
    public:
        int numberOfSteps(int num) {
            int ans=0;
            while(num){
                if(num&1){
                    num--;
                }else{
                    num/=2;
                }
                ans++;
            }
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    直接使用循环即可。

    7.力扣1492

    原题链接

    1492. n 的第 k 个因子

    源码剖析

    class Solution {
    public:
        int kthFactor(int n, int k) {
            int i = 0;
            int ans = 1;
            while(ans<=n){
                if(n%ans==0){
                    ++i;
                    if(i==k){
                        return ans;
                    }else{
                        ans++;
                    }
                }else{
                    ans++;
                }
            }
            return -1;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    使用了一堆的判断进行处理,不过效率还可以。

    8.力扣2006

    原题链接

    2006. 差的绝对值为 K 的数对数目

    源码剖析

    class Solution {
    public:
        int countKDifference(vector<int>& nums, int k) {
            int ans = 0;
            int size = nums.size();
            for(int i = 0;i<size;++i){
                for(int j = i+1;j<size;++j){
                    if(abs(nums[i]-nums[j])==k){
                        ans++;
                    }
                }
            }
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    解题报告

    9.力扣1929

    原题链接

    1929. 数组串联

    源码剖析

    class Solution {
    public:
        vector<int> getConcatenation(vector<int>& nums) {
            int n = nums.size();
            for(int i = 0;i<n;++i){
                nums.push_back(nums[i]);
            }
            return nums;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    直接将原来的元素按顺序在往原数组的后面填入就可以了。

    10.力扣1108

    原题链接

    1108. IP 地址无效化

    源码剖析

    class Solution {
    public:
        string defangIPaddr(string address) {
            string ans;
            for(int i = 0;i<address.size();++i){
                if(address[i]=='.'){
                    ans+="[.]";
                }else{
                    ans+=address[i];
                }
            }
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    string类确实比char数组好用多了。

  • 相关阅读:
    我的创作纪念日
    前端异常监控方案
    c++(五)
    《第一行代码》核心知识点:Activity(活动)
    模板template
    优秀的 Modbus 主站(主机、客户端)仿真器、串口调试工具
    sql执行插入语句返回刚刚生成的自动编号
    微信小程序H5 uniapp
    北京化工大学数据结构2022/10/27作业 题解
    除静电离子风棒的工作原理及应用
  • 原文地址:https://blog.csdn.net/smallwind256/article/details/125995413