題目:
給你一個以二進(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
解題方法:
按照題目要求遍歷字符串處理就行了:
- 計算當(dāng)前字符實際大?。?code>k=s[i]-'0'+carry;
- 判斷k大小:1. k==1,很明顯,按照題目意思,需要加1然后除2,操作步驟為2,且會有一個進(jìn)位;2. k==2,這個時候最后一位實際是0,有一個進(jìn)位,對應(yīng)操作步驟為1;k==0,很簡單,沒有進(jìn)位,且操作數(shù)為1,最簡單的情況;
- 最后就是對字符串第一個字符單獨處理。
代碼和結(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;
}
};
運行結(jié)果:
最近感覺身心俱疲,確實有點累了,今天睡醒過來,想打游戲,掙扎了半天還是刷起了題,感覺刷題也算是一種消遣吧,雖然有的時候真的覺得刷起來好難,但是做出來的時候還是很開心的。
原題鏈接:https://leetcode-cn.com/problems/number-of-steps-to-reduce-a-number-in-binary-representation-to-one/