題目:
給你一個以二進(jìn)制形式表示的數(shù)字 s 盏缤。請你返回按下述規(guī)則將其減少到 1 所需要的步驟數(shù):
- 如果當(dāng)前數(shù)字為偶數(shù)啼器,則將其除以 2 蓖议。
- 如果當(dāng)前數(shù)字為奇數(shù),則將其加上 1 壁榕。
題目保證你總是可以按上述規(guī)則將測試用例變?yōu)?1 。
示例:
輸入:s = "1101"
輸出:6
解釋:"1101" 表示十進(jìn)制數(shù) 13 桩皿。
Step 1) 13 是奇數(shù)股缸,加 1 得到 14
Step 2) 14 是偶數(shù),除 2 得到 7
Step 3) 7 是奇數(shù)借卧,加 1 得到 8
Step 4) 8 是偶數(shù)盹憎,除 2 得到 4
Step 5) 4 是偶數(shù),除 2 得到 2
Step 6) 2 是偶數(shù)铐刘,除 2 得到 1
解題方法:
按照題目要求遍歷字符串處理就行了:
- 計(jì)算當(dāng)前字符實(shí)際大信忝俊:
k=s[i]-'0'+carry
;- 判斷k大辛场:1. k==1檩禾,很明顯,按照題目意思疤祭,需要加1然后除2盼产,操作步驟為2,且會有一個進(jìn)位勺馆;2. k==2辆飘,這個時候最后一位實(shí)際是0,有一個進(jìn)位谓传,對應(yīng)操作步驟為1蜈项;k==0,很簡單续挟,沒有進(jìn)位紧卒,且操作數(shù)為1,最簡單的情況诗祸;
- 最后就是對字符串第一個字符單獨(dú)處理跑芳。
代碼和結(jié)果:
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;
}
};
運(yùn)行結(jié)果:最近感覺身心俱疲轴总,確實(shí)有點(diǎn)累了,今天睡醒過來博个,想打游戲怀樟,掙扎了半天還是刷起了題,感覺刷題也算是一種消遣吧盆佣,雖然有的時候真的覺得刷起來好難往堡,但是做出來的時候還是很開心的。
原題鏈接:https://leetcode-cn.com/problems/number-of-steps-to-reduce-a-number-in-binary-representation-to-one/