题目:
给你一个以二进制形式表示的数字 s 。请你返回按下述规则将其减少到 1 所需要的步骤数:
- 如果当前数字为偶数,则将其除以 2 。
- 如果当前数字为奇数,则将其加上 1 。
题目保证你总是可以按上述规则将测试用例变为 1 。
示例:
输入:s = "1101"
输出:6
解释:"1101" 表示十进制数 13 。
Step 1) 13 是奇数,加 1 得到 14
Step 2) 14 是偶数,除 2 得到 7
Step 3) 7 是奇数,加 1 得到 8
Step 4) 8 是偶数,除 2 得到 4
Step 5) 4 是偶数,除 2 得到 2
Step 6) 2 是偶数,除 2 得到 1
解题方法:
按照题目要求遍历字符串处理就行了:
- 计算当前字符实际大小:
k=s[i]-'0'+carry
;- 判断k大小:1. k==1,很明显,按照题目意思,需要加1然后除2,操作步骤为2,且会有一个进位;2. k==2,这个时候最后一位实际是0,有一个进位,对应操作步骤为1;k==0,很简单,没有进位,且操作数为1,最简单的情况;
- 最后就是对字符串第一个字符单独处理。
代码和结果:
class Solution {
public:
int numSteps(string s) {
int carry=0;
int cnt=0;
for(int i=s.size()-1;i>0;i--)
{
int k=s[i]-'0'+carry;
if(k==1)
{
cnt+=2;
carry=1;
}
else if(k==2)
{
cnt+=1;
carry=1;
}
else
{
cnt++;
}
}
int k=s[0]-'0'+carry;
if(k==1) return cnt;
else return cnt+1;
}
};
运行结果:
最近感觉身心俱疲,确实有点累了,今天睡醒过来,想打游戏,挣扎了半天还是刷起了题,感觉刷题也算是一种消遣吧,虽然有的时候真的觉得刷起来好难,但是做出来的时候还是很开心的。
原题链接:https://leetcode-cn.com/problems/number-of-steps-to-reduce-a-number-in-binary-representation-to-one/
网友评论