浅谈 将数字变成 0 的操作次数 问题

将数字变成 0 的操作次数

问题:
给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。

思路:
第一种:

  1. 如果 num 为对 2 取余为 0,则 num 变为一半,否则减一,每次 count 计数器加一,直到 num == 0。
  2. 返回 count。

第二种:

  1. 位运算如果和 1 与运算,为 0 则 num 为奇数,二进制末位为 1,则与 -2 进行与运算相当于减一,否则右移一位相当于除 2。直到 num == 0。
  2. 返回 count。

低效 (4 ms)

class Solution {
    
    
public:
    int numberOfSteps (int num) {
    
    
        auto count = 0;
        while(num > 0) {
    
    
            if(num % 2 == 0) num /= 2;
            else num--;
            count++;
        }
        return count;
    }
};

高效 (0 ms)

class Solution {
    
    
public:
    int numberOfSteps (int num) {
    
    
        auto count = 0;
        while(num > 0) {
    
    
        // -2 的二进制为 1111111111111111111111111111111111111111111111111111111111111110
            num = num & 1 ? num & -2 : num >> 1;  
            count++;
        }
        return count;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_48033173/article/details/113149880
今日推荐