給定乙個正整數 n,找出小於或等於 n 的非負整數中,其二進位制表示不包含 連續的1 的個數。
示例 1:
輸入: 5
輸出: 5
解釋:
下面是帶有相應二進位制表示的非負整數<= 5:
0 : 0
1 : 1
2 : 10
3 : 11
4 : 100
5 : 101
其中,只有整數3違反規則(有兩個連續的1),其他5個滿足規則。
說明: 1 <= n <= 109
思路:不存在連續1的數字裡面,1的後一位必定是0
所以我們把這個數字右移一位,然後和自身位與的結果必定是0
連續1的組合都是源自兩個 11
所以我們碰到11*** 的時候就把後面的數字全部pass,
怎麼處理呢?
比如我們遇到了1100
就需要pass掉1100 1101 1110 1111
一共4個數字,其實就是第兩位能構成的數字個數
也就是100,所以我們 還是把這個數字右移一位,然後和自身位與,就可以得到100
class solution
cout<}
return ans;
}};
任意非負整數,求1 n之間含有1的整數的個數
題目描述 求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。解析 1...
100 以內的非負整數的加法計算
問題 kiki今年5歲了,已經能夠認識100以內的非負整數,並且並且能夠進行 100 以內的非負整數的加法計算。不過,bobo老師發現kiki在進行大於等於100的正整數的計算時,規則如下 只保留該數的最後兩位,例如 對kiki來說1234等價於34 如果計算結果大於等於 100,那麼kiki也僅保...
求n個連續自然數之和為乙個非負整數的陣列
def find combinations num n int num 0.5 這裡直接開根號,縮小迴圈範圍 res 前可以轉化成中間項的倍數,所以下面for迴圈求得是中間項的值 for i in range 2 n 1 if num i 0 mid 01 i 中間數 mid 02 int num ...