| 给你一个非负整数 num,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。 示例 1: 输入:num = 14输出:6
 解释:
 步骤 1) 14 是偶数,除以 2 得到 7 。
 步骤 2) 7 是奇数,减 1 得到 6 。
 步骤 3) 6 是偶数,除以 2 得到 3 。
 步骤 4) 3 是奇数,减 1 得到 2 。
 步骤 5) 2 是偶数,除以 2 得到 1 。
 步骤 6) 1 是奇数,减 1 得到 0 。
 示例 2:
 输入:num = 8输出:4
 解释:
 步骤 1) 8 是偶数,除以 2 得到 4 。
 步骤 2) 4 是偶数,除以 2 得到 2 。
 步骤 3) 2 是偶数,除以 2 得到 1 。
 步骤 4) 1 是奇数,减 1 得到 0 。
 示例 3:
 输入:num = 123输出:12
 ?
 提示: 0 <= num <= 10^6 class Solution {
    public int numberOfSteps(int num) {
        int sum = 0;
      for(int i = 1; num != 0; i++){
            if((num % 2) == 0) {
            num /= 2;
        }else{
            num -= 1;
        }
        sum = i;
      }
      
      return sum;
    }
}
 官方解答:方法一:模拟思路与算法

class Solution {
    public int numberOfSteps(int num) {
        int ret = 0;
        while (num > 0) {
            ret += (num > 1 ? 1 : 0) + (num & 0x01);
            num >>= 1;
        }
        return ret;
    }
}
 ?方法二:
 class Solution {
    public int numberOfSteps(int num) {
        return num == 0 ? 0 : length(num) - 1 + count(num);
    }
    public int length(int num) {
        int clz = 0;
        if ((num >> 16) == 0) {
            clz += 16;
            num <<= 16;
        }
        if ((num >> 24) == 0) {
            clz += 8;
            num <<= 8;
        }
        if ((num >> 28) == 0) {
            clz += 4;
            num <<= 4;
        }
        if ((num >> 30) == 0) {
            clz += 2;
            num <<= 2;
        }
        if ((num >> 31) == 0) {
            clz += 1;
        }
        return 32 - clz;
    }
    public int count(int num) { 
        num = (num & 0x55555555) + ((num >> 1) & 0x55555555);
        num = (num & 0x33333333) + ((num >> 2) & 0x33333333);
        num = (num & 0x0F0F0F0F) + ((num >> 4) & 0x0F0F0F0F);
        num = (num & 0x00FF00FF) + ((num >> 8) & 0x00FF00FF);
        num = (num & 0x0000FFFF) + ((num >> 16) & 0x0000FFFF);
        return num;
    }
}
 |