给定一个正整数 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/non-negative-integers-without-consecutive-ones
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
不存在连续1的数字里面,1的后一位必定是0
所以我们把这个数字右移一位,然后和自身位与的结果必定是0
连续1的组合都是源自两个 11
所以我们碰到11XXX 的时候就把后面的数字全部PASS,
怎么处理呢?
比如我们遇到了1100
就需要PASS掉1100 1101 1110 1111
一共4个数字,其实就是第两位能构成的数字个数
也就是100,所以我们 还是把这个数字右移一位,然后和自身位与,就可以得到100
class Solution {
public:
int findIntegers(int n)
{
int ans = 0;
for(int i=0;i<=num;i++)
{
int tmp = i&(i>>1);
if(tmp==0)
ans++;
else
{
i=i+tmp-1;
}
cout<<i<<endl;
}
return ans;
}
};