将数字变成 0 的操作次数 | LeetCode刷题笔记

「这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战


相关文章

LeetCode刷题汇总:LeetCode刷题

一、题目描述


将数字变成 0 的操作次数

给你一个非负整数 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
    复制代码
  • 说明

    • 思维定势了我,第一反应就是直接暴力来干就完事儿了!
    • 首先,定义中间数temp暂存计算完次数的,每次计算完改变传入的nums的值,一直循环。
    • 里面增加判断奇数偶数即可。
    • 话不多说,直接看代码。

三、AC 代码


  • 暴力破解:
class Solution {
   public int numberOfSteps(int num) {
        int temp = 0;
        while(num != 0){
            if(num % 2 == 0){
                num /= 2;
            }else{
                num -= 1;
            }
            temp++;
        }
        return temp;
    }
}
复制代码
  • 执行结果:
  • image-20211128192526308.png
  • 位运算:

    • 都说计算机最快的计算方式是位运算
    • 那么我们思路不变,把所有的判断还有计算变成位运算,是不是更nice了呀!
    • class Solution {
         public int numberOfSteps(int num) {
              int temp = 0;
              while(num != 0){
                  //判断当前数的奇偶性
                  if((num & 1) == 0){
                      num = num >> 1;
                  }else{
                      num = num ^ 1;
                  }
                  temp++;
              }
              return temp;
          }
      }
      复制代码
    • 执行结果:
    • image-20211128192948332.png
  • 实话实说,这题,是LeetCode上第三好解的题目!

  • image-20211128193141985.png


路漫漫其修远兮,吾必将上下求索~

如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah

猜你喜欢

转载自juejin.im/post/7035582112665174052