首页 > 其他分享 >[LeetCode] 1342. Number of Steps to Reduce a Number to Zero 将数字变成 0 的操作次数

[LeetCode] 1342. Number of Steps to Reduce a Number to Zero 将数字变成 0 的操作次数

时间:2023-04-25 14:12:51浏览次数:46  
标签:number int res 1342 Reduce Number obtain Step num


Given an integer num, return the number of steps to reduce it to zero.

In one step, if the current number is even, you have to divide it by 2, otherwise, you have to subtract 1 from it.

Example 1:

Input: num = 14
Output: 6
Explanation: 
Step 1) 14 is even; divide by 2 and obtain 7. 
Step 2) 7 is odd; subtract 1 and obtain 6.
Step 3) 6 is even; divide by 2 and obtain 3. 
Step 4) 3 is odd; subtract 1 and obtain 2. 
Step 5) 2 is even; divide by 2 and obtain 1. 
Step 6) 1 is odd; subtract 1 and obtain 0.

Example 2:

Input: num = 8
Output: 4
Explanation: 
Step 1) 8 is even; divide by 2 and obtain 4. 
Step 2) 4 is even; divide by 2 and obtain 2. 
Step 3) 2 is even; divide by 2 and obtain 1. 
Step 4) 1 is odd; subtract 1 and obtain 0.

Example 3:

Input: num = 123
Output: 12

Constraints:

  • 0 <= num <= 10^6

这道题给了一个非负整数 num,问需要多少步可以将其变为0,方法是若是偶数,则除以2,若是奇数,则自减1。既然是一道简单题,那么博主认为就应该没有啥特别的技巧,就直接按要求来写就行了,用一个 while 循环,若 num 大于0则进行循环,在循环中判断,若 num 为偶数,则除以2,否则自减1,然后结果 res 自增1。循环退出后返回 res 即可,参见代码如下:


解法一:

class Solution {
public:
    int numberOfSteps(int num) {
        int res = 0;
        while (num > 0) {
            num = (num % 2 == 0) ? num / 2 : (num - 1);
            ++res;
        }
        return res;
    }
};

我们可以稍稍进行一下优化,若判断 num 是奇数的话,上面的解法是先减去1,然后在下次循环中再除以2,这里可以直接两步一起处理,因为整型数情况下的奇数除以2就等于其先减1再除以2的值。直接结果 res 加上2就可以了,需要注意的是,循环退出后,返回 res-1,因为当 num 为1的时候,res 还是加上了2,需要减掉。还有就是要提前判断 num 为0的情况,直接返回0即可,参见代码如下:


解法二:

class Solution {
public:
    int numberOfSteps(int num) {
        if (num == 0) return 0;
        int res = 0;
        while (num > 0) {
            res += (num & 1) ? 2 : 1;
            num >>= 1;
        }
        return res - 1;
    }
};

这道题还有特别叼的解法,一行搞定碉堡了,根据上面的解法,每次 num 都要除以2,则若能快速知道总共可以除以多少个2的话,就可以直接将个数加到结果 res 中,则可以对 num 取以2为底的对数,同时还要将过程中的奇数加上,快速处理的方法就是找出 num 的二进制数中的1的个数,可以用 built-in 类 bitset 来得到1的个数,跟之前的对数值加起来即可,注意还是要处理 num 为0的 corner case,因为不能对0取对数,参见代码如下:


解法三:

class Solution {
public:
    int numberOfSteps(int num) {
        return num == 0 ? 0 : log2(num) + bitset<32>(num).count();
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/1342


类似题目:

Minimum Moves to Reach Target Score

Count Operations to Obtain Zero


参考资料:

https://leetcode.com/problems/number-of-steps-to-reduce-a-number-to-zero/

https://leetcode.com/problems/number-of-steps-to-reduce-a-number-to-zero/solutions/502809/just-count-number-of-0-and-1-in-binary/

https://leetcode.com/problems/number-of-steps-to-reduce-a-number-to-zero/solutions/502719/c-single-line-in-o-1-with-explanation/


LeetCode All in One 题目讲解汇总(持续更新中...)

标签:number,int,res,1342,Reduce,Number,obtain,Step,num
From: https://www.cnblogs.com/grandyang/p/17352435.html

相关文章

  • 【vue】error in ./src/components/NumberInfo/NumberInfo.vue
    出现背景:ant designvuepro执行yarnrunserve解决办法:修改src/components/NumberInfo.vue文件中style部分原来的:<stylelang="less"scoped>@import"index";</style>注释掉 @import"index"<stylelang="less"scoped&g......
  • #yyds干货盘点#reduce和map的优雅写法
    reduce1、可以使用reduce方法来实现对象数组中根据某一key值求和例如,假设有以下对象数组:constarr=[{name:'apple',price:2},{name:'banana',price:3},{name:'orange',price:4},];复制代码如果要根据price属性求和,可以使用以下代码:constsum=arr.r......
  • codeforces 225B B. Well-known Numbers(数论+二分+贪心+构造)
    题目链接:codeforces225B题目大意:定义f(k,n)为类似菲波那契数推导,只不过变为前k项的和,然后给出一个数s,利用k-菲波那契数构造出一个不重复的集合的元素和为s,集合的规模大于1题目分析:首先因为菲波那契数的增长速度快的吓人,所以给的数据范围109很快就能达到,我们得到O(n)的构造出所有的......
  • hiveSQL mapreduce任务调优
    sethive.merge.mapredfiles=true;--在Map-Reduce的任务结束时合并小文件setmapred.max.split.size=30000000;--决定每个map处理的最大的文件大小,单位为B--setmapred.min.split.size=10000000;--公司集群默认值--setmapred.min.split.size.per.node=;......
  • HTML input type="number" 隐藏默认的步进箭头
    HTMLinputtype="number"隐藏默认的步进箭头number类型的<input>元素用于让用户输入一个数字,其包括内置验证以拒绝非数字输入。浏览器可能会选择提供步进箭头,让用户可以使用鼠标增加和减少输入的值,或者只需用指尖敲击即可。但有些场景需要隐藏默认的步进箭头。要隐藏HTML......
  • 阶乘 reduce函数 operator模块
       fromfunctoolsimportreducefromoperatorimportmuldeffact(n):#使用reduce和operator.mul函数计算阶乘returnreduce(mul,range(1,n+1))#使用reduce函数和一个匿名函数计算阶乘#returnreduce(lambdaa,b:a*b,range(1,n+1)) ......
  • hive row_number分组排序top
    自从hive0.11.0开始,加入了类似orcle的分析函数,很强大,可以查询到分组排序top值使用方法跟oracle没有差别 贴个小例子查询的是同一个操作下pv前十的用户select*,row_number()OVER(PARTITIONBYt3.actionORDERBYpvdesc)ASflagfrom(selectaction,uuid,count(1)as......
  • UESTC Final Pan's prime numbers 1272 (坑)
    FinalPan'sprimenumbersTimeLimit:3000/1000MS(Java/Others)   MemoryLimit:65535/65535KB(Java/Others)Submit StatusFinalPanlikesprimenumbersverymuch.Oneday,hewanttofindthesuperprimenumbers.Aprimenumbers n(n>4)......
  • CF449D Jzzhu and Numbers
    CF449DJzzhuandNumbers黄金定律:给定序列求答案,但答案与序列顺序无关的题目,要么考虑把序列转权值序列,要么对序列排序。二进制题按大小排序看起来就没啥用,那就转成权值序列。即,设\(c(i)\)表示\(i\)在\(a\)中的出现次数。同时设\(V\)为\(a\)的值域。然后直接算发现不......
  • Apple iWork(Pages、Numbers、Keynote)13.0 - 文档、电子表格、演示文稿
    请访问原文链接:https://sysin.org/blog/apple-iwork-13/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org苹果今天将其专为iOS和macOS设备设计的iWork应用套件更新为版本12(sysin),引入了许多新功能和改进功能。文档、电子表格、演示文稿,尽可集思广益。Pages......