n位二进制,求不包含连续1的二进制(n位)数字个数。

http://www.geeksforgeeks.org/count-number-binary-strings-without-consecutive-1s/

也可以令f[i],表示共i位的二进制数字中,不包含连续1的二进制(i位)数字的个数。

  f[i]的组成有两部分:

    最高位为1:只有当次高位为0,且满足条件的二进制数字个数,即 f[i-2]

    最高位为0:次高位为0或1且满足条件的数字个数,即f[i-1]

  得: f[i] = f[i-2] + f[i-1]

给定num,求1~num的数字中,求对应的二进制不包含连续1的数字个数。

600. Non-negative Integers without Consecutive Ones

Given a positive integer n, find the number of non-negative integers less than or equal to n, whose binary representations do NOT containconsecutive ones.

Example 1:

Input: 5
Output: 5
Explanation:
Here are the non-negative integers <= 5 with their corresponding binary representations:
0 : 0
1 : 1
2 : 10
3 : 11
4 : 100
5 : 101
Among them, only integer 3 disobeys the rule (two consecutive ones) and the other 5 satisfy the rule.

Note: 1 <= n <= 109

题目:

https://leetcode.com/contest/leetcode-weekly-contest-34/problems/non-negative-integers-without-consecutive-ones/

给定的数字num,转换成二进制,共n位。

首先由上一题的结论,得到f[i],1 <= i < n

假设数字num为从高位到低位B: bn-1, bn-2, ..., 3,2,1

   应该在比num小或相等的数字中,计算没有连续二进制1的数字的个数。

   从高位到低位,遍历B,如果遇到1,则对应位改变为0后,则肯定比原num小。

     如:10110,从高到低遍历二进制位

       第一个1,前缀变为0,剩下四位,比原来的num小,则满足条件的数字个数为f(4)

     第二个1,前缀变为100,剩下两位,100XX,比原来的num小,则满足条件的数字个数为f(2)

       第三个1,前缀变为1010,剩下一位,1010X,比原来的num小,则满足条件的数字个数为f(1)

       遍历过程中,当遇到两个连续的1时需要中止遍历。如原num为1XX11XXX,继续遍历找到后面的1并改变为0,得到的数字确实比num小,但不满足不存在连续1的条件。

     遍历过程中,考虑的都是比原num小的数,最后还需要判断一下原num是否符合条件。

    int findIntegers(int num) {
vector<int> b_num;
//int tmp = num;
while( num != )
{
b_num.push_back( num % );
num /= ;
}
int f[] = { };
f[] = ;
f[] = ;
int n = b_num.size();
for( int i = ; i < n; i++ )
{
f[i] = f[i-] + f[i-];
}
int ans = ; int has_d_one = false;
for( int i = n-; i >= ; i-- )
{
if( b_num[i] )
{
ans += f[i];
if( i < n- )
{
if( b_num[i+] )
{
has_d_one=true;
break;
}
} }
} //判断一下num自身是否含连续1
//if( !( tmp & (tmp<<1) ) )
//{
// ans++;
//}
if( !has_d_one )
{
ans++;
}
return ans;
}

Non-negative Integers without Consecutive Ones的更多相关文章

  1. [LeetCode] Non-negative Integers without Consecutive Ones 非负整数不包括连续的1

    Given a positive integer n, find the number of non-negative integers less than or equal to n, whose ...

  2. [Swift]LeetCode600. 不含连续1的非负整数 | Non-negative Integers without Consecutive Ones

    Given a positive integer n, find the number of non-negativeintegers less than or equal to n, whose b ...

  3. 600. Non-negative Integers without Consecutive Ones

    Given a positive integer n, find the number of non-negative integers less than or equal to n, whose ...

  4. [Algorithm] Count Negative Integers in Row/Column-Wise Sorted Matrix

    // Code goes here function countNegative (M, n, m) { count = ; i = ; j = m - ; && i < n) ...

  5. 第十六周 Leetcode 600. Non-negative Integers without Consecutive Ones(HARD) 计数dp

    Leetcode600 很简单的一道计数题 给定整数n 求不大于n的正整数中 二进制表示没有连续的1的数字个数 在dp过程中只要保证不出现连续1以及大于n的情况即可. 所以设计按位dp[i][j]表示 ...

  6. Interleaving Positive and Negative Numbers

    Given an array with positive and negative integers. Re-range it to interleaving with positive and ne ...

  7. [LintCode] Interleaving Positive and Negative Numbers

    Given an array with positive and negative integers. Re-range it to interleaving with positive and ne ...

  8. Lintcode: Interleaving Positive and Negative Numbers 解题报告

    Interleaving Positive and Negative Numbers 原题链接 : http://lintcode.com/zh-cn/problem/interleaving-pos ...

  9. SH Script Grammar

    http://linux.about.com/library/cmd/blcmdl1_sh.htm http://pubs.opengroup.org/onlinepubs/9699919799/ut ...

随机推荐

  1. 正则表达式(TypeScript, JavaScript)

    课题 使用正则表达式匹配字符串 使用正则表达式 "\d{3}-(\d{4})-\d{2}" 匹配字符串 "123-4567-89" 返回匹配结果:'" ...

  2. WebStorm新创建项目介绍

    WebStorm创建一个项目 这里支持有很多的类型项目: Empty Project         ----一个空的项目 Html5 Boilerplate     ----HTML5开发框架 We ...

  3. Extjs动态增删组件

    在项目中遇到要动态的增加删除一个组件,于是就查找资料,实现了下面的效果. Ext.onReady(function(){ // Ext.Msg.alert("提示","h ...

  4. C++ new 和malloc 区别

    1.分配地方不同,malloc是堆上面,new是自由存储区域 2.malloc/delete是函数,new/delete是操作符,可以重载 3.malloc 要指定大小,返回的是void*指针,开辟的 ...

  5. 点击对应不同name的button,显示不同name的弹窗(弹窗功能)

    (通过html5方法自定义属性选择,因此会有兼容性,此方法可适用移动端) 将button的name,与弹窗的name设为变量,作为参数传递. Button的name可以是自定义name,HTML5自定 ...

  6. httpClient 深入浅出~

    本文偏重使用,简单讲述httpclient,其实在网络编程中,基于java的实现几乎都是包装了socket的通信,然后来模拟各种各样的协议:httpclient其实就是模拟浏览器发起想服务器端的请求, ...

  7. Jetty-attack-test

    import httplib, urllib, ssl, string, sys, getopt from urlparse import urlparse ''' Author: Gotham Di ...

  8. C++ 动态创建按钮及 按钮的消息响应

    动态创建的按钮 都会在消息 OnCommand 中得到处理,无论是什么消息,都会处理的 1\创建按钮 CButton* btn = new CButton(); btn->Create(_T(, ...

  9. Java8 Optional的简单操作

    我们经常会遇到这种情况:首先判断一个对象是否为null,如果不为null,获取一个对象中的一个属性,如果该属性不为null,又获取该属性的属性,如果该属性的属性不为null,又获取属性的属性的属性: ...

  10. requirejs案例

    <script src="./js/require.js" data-main="./js/main.js"></script>   / ...