題目連結(jié):
題目意譯:
給定以字串表示的一整數(shù)之二進(jìn)位表示法,回傳根據(jù)以下規(guī)則將其值降至 1 所需的步驟:
如果當(dāng)前數(shù)字是偶數(shù),你必須將其除以 2。
如果當(dāng)前數(shù)字是奇數(shù),你必須將其加上 1。
保證在所有測資中你必定可以抵達(dá) 1。
限制:
1 ≦ s.length ≦ 500
s 只由字元 '0' 或 '1' 組成。
s[0] == '1'
範(fàn)例測資:
範(fàn)例 1:
輸入: s = "1101"
輸出: 6
解釋: "1101" 對應(yīng)著十進(jìn)位制中的數(shù)字 13。
步驟 1) 13 是奇數(shù),將其加上 1 並得到 14。
步驟 2) 14 是偶數(shù),將其除以 2 並得到 7。
步驟 3) 7 是奇數(shù),將其加上 1 並得到 8。
步驟 4) 8 是偶數(shù),將其除以 2 並得到 4。
步驟 5) 4 是偶數(shù),將其除以 2 並得到 2。
步驟 6) 2 是偶數(shù),將其除以 2 並得到 1。
範(fàn)例 2:
輸入: s = "10"
輸出: 1
解釋: "10" 對應(yīng)著十進(jìn)位制中的數(shù)字 2。
步驟 1) 2 是偶數(shù),將其除以 2 並得到 1。
範(fàn)例 3:
輸入: s = "1"
輸出: 0
解題思維:
很明顯地,如果一開始 s 的結(jié)尾有著連續(xù) C 個(gè) 0,則會直接執(zhí)行 C 次除以 2 的動作。
接著如果現(xiàn)在 s 是以連續(xù) L 個(gè) 1,則我們會先做加上 1 之操作。而這將使得這 L 個(gè) 1 連續(xù)進(jìn)位形成最終的一個(gè) 1 以及 L 個(gè) 0 在結(jié)尾。此時(shí)便可以直接進(jìn)行連續(xù) L 次的除以 2。因此「這一輪」總計(jì) L + 1 次。
可以看到由於現(xiàn)在 s 會是以 1 作為結(jié)尾,因此可以重複這個(gè)結(jié)論直到 s 變?yōu)?1 為止。當(dāng)然,我們實(shí)際上不需要真的去更動 s 本身,只需要統(tǒng)計(jì)現(xiàn)在看到的 1 的數(shù)量以及一開始看到的 0 之?dāng)?shù)量即可。
最後整個(gè)過程中的總操作數(shù)即為所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。