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

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


相关文章

LeetCode刷题汇总:LeetCode刷题

一、题目描述


将数字变成 0 的操作次数

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

二、思路分析


  • 看看题目的示例,我们来理一理这个思路~
  • 示例 1:
1
2
3
4
5
6
7
8
9
ini复制代码输入: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:
1
2
3
4
5
6
7
ini复制代码输入:num = 8
输出:4
解释:
步骤 1) 8 是偶数,除以 2 得到 4 。
步骤 2) 4 是偶数,除以 2 得到 2 。
步骤 3) 2 是偶数,除以 2 得到 1 。
步骤 4) 1 是奇数,减 1 得到 0 。
  • 示例3:
1
2
ini复制代码输入:num = 123
输出:12
  • 说明
+ 思维定势了我,第一反应就是直接暴力来干就完事儿了!
+ 首先,定义中间数`temp`暂存计算完次数的,每次计算完改变传入的nums的值,一直循环。
+ 里面增加判断奇数偶数即可。
+ 话不多说,直接看代码。

三、AC 代码


  • 暴力破解:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
dart复制代码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`了呀!
+ 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dart复制代码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](https://gitee.com/songjianzaina/juejin_p5/raw/master/img/a5c17763675f70fee942e911d9db3d5061d0cd7a1a2d460af7edefb1d98725ac)
  • 实话实说,这题,是LeetCode上第三好解的题目!
  • image-20211128193141985.png

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

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

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%