大家好,我是晴天学长,今天的算法题思想用到了位运算中两个常考的点,一个是按位与&的n&-n和n&n-1,一个是位运算中的<< ,题目不难,但是知识的思路的运用还是值得学习的,需要的小伙伴请自取哦!💪💪💪
1 )将整数减少到零需要的最少次数
2) .算法思路
- 把 n看成二进制数,那么更高位的比特 11 是会受到更低位的比特 11 的加减影响的,但是,最小的比特 11 没有这个约束。
- 那么考虑优先消除最小的比特 11,设它对应的数字为 lowbit。(lowbit是n最低位的1)
- 消除方法只能是加上 lowbit,或者减去 lowbit。
- 贪心的策略是:如果有多个连续 11,那么采用加法是更优的,可以一次消除多个 11;否则对于单个 11,减法更优。
3).代码示例
static class Solution {
public static int minOperations(int n) {
int sum = 1;
while ((n & (n - 1)) > 0) { // n 不是 2 的幂次
int lb = n & -n;
if ((n & (lb << 1)) > 0) n += lb; //lb是正数n二进制的最后一个1,其他位都是0,<< 1 左移一位,如果是1的话,会>0,如果是0的话,就会等于0.
else n -= lb; // 单个 1
++sum;
}
return sum;
}
}
4 ) . 总结
- n=n&(n-1)是把二进制的最后一个1变成0.
- lb=n& -n取到二进制最后一个1,比如10: 0000 1010 lb=0000 0010
- << = 1 二进制中的1所有都往左移动1位,依次类推。