阅读视图

发现新文章,点击刷新页面。

C++双百模拟

解题思路

这题其实挺简单,就是统计num1-num2之后的数的二进制位为1的个数是否少于cnt。
举例:

cnt=1:3-(-2)=5->101(2>cnt)

cnt=2:5-(-2)=7->111(3>cnt)

cnt=3:7-(-2)=9->1001(2<cnt)

结束

原理很简单,因为根据二进制特性,num1-num2余下的必然为2的幂之和,只要该和的加数个数少于等于cnt,无论这个和是什么,我都可以用恰好cnt个数相加得到num1-num2。

注意:根据二进制位数,cnt不会超过32.

代码

###cpp

class Solution {
public:
    int makeTheIntegerZero(int num1, int num2) {
        int cnt=0;
        long n1=num1,n2=num2;
        while(1){
            cnt++;
            n1-=n2;
            if(cnt<=n1&&__builtin_popcountll(n1)<=cnt)return cnt;
            else if(n2>=-1&&n1<0)return -1;
        }
        return 0;
    }
};
❌