---
# System prepended metadata

title: '[LeetCode 600. Non-negative Integers without Consecutive Ones ](https://leetcode.com/explore/challenge/card/july-leetcoding-challenge-2021/611/week-4-july-22nd-july-28th/3826/)'

---

# [LeetCode 600. Non-negative Integers without Consecutive Ones ](https://leetcode.com/explore/challenge/card/july-leetcoding-challenge-2021/611/week-4-july-22nd-july-28th/3826/)
### Daily challenge Jul 25, 2021 (HARD)

>Given a positive integer `n`, return the number of the integers in the range ``[0, n]`` whose binary representations **do not** contain consecutive ones.


:::info
**Example 1:**
**Input:** n = 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. 
:::

:::info
**Example 2:**
**Input:** n = 1
**Output:** 2
:::

:::info
**Example 3:**
**Input:** n = 2
**Output:** 3
:::


:::warning
**Constraints:**
1 <= n <= 10^9^
:::

---



### Approach 1 : Bit Manipulation :book: 
**`0 ms ( 100% )`** **`O(32)`**

>以**二進位**觀察下列關係 : 
**`[ 0 ~ 1 ) = 1`** ---> `( 0 )`。
**`[ 00 ~ 10 ) = 2`** ---> `( 00, 01 )`。
**`[ 000 ~ 100 ) = 3`** ---> `( 000, 001, 010 )`。
**`[ 0000 ~ 1000 ) = 5`** ---> `( 0000, 0001, 0010, 0100, 0101 )`。
**`[ 00000 ~ 10000 ) = 8`** ---> `( 00000, 00001, 00010, 00100, 00101, 01000, 01001, 01010 )`。
>...
>...

可以發現與 `Fibonacci Sequence` 相同。
假設 **`bit[k]`** 為 `Fibonacci Sequence` : 
---> `bit[0] = 1` 表示**小於 ( 1 )~2~** 的總數。
---> `bit[1] = 2` 表示**小於 ( 10 )~2~** 的總數，以此類推。

因為 `input` 範圍屬於 `int`，所以 **`bit[]`** 只需要計算 32 項 ( or 30 項 ---> n <= 10^9^ )。

* **`k = 29`** 開始由大到小尋找 `n` 在哪幾項出現 `1`。
> 為什麼要從 `29` ?
> 因為 10^9^ = ( 111011100110101100101000000000)~2~ ---> `30 bit`。
* **`pre_bit`** 紀錄上一個 `bit` 是否為 `1`。
* 找到 `1` 後 **`ans += bit[k]`**。
>若 **`pre_bit == 1`** 表示之後的答案皆不符合題意，直接回傳 `ans` ( 原因在後面範例解釋 )。

---
>EXAMPLE : **`n = 150 = (10010110)`**。
>* `k = 7` ---> ans += bit[7] = 34。 [ **++00000000++** ~ **++10000000++** )。
>* `k = 4` ---> ans += bit[4] = 42。 [ 100 **++00000++** ~ 100 **++10000++** )。
>* `k = 2` ---> ans += bit[2] = 45。 [ 10010 **++000++** ~ 10010 **++100++** )。
>* `k = 1` ---> ans += bit[1] = 47。 [ 100101 **++00++** ~ 100101 **++10++** )。
此時 **`pre_bit == 1`** ---> 連續出現兩個 `1`，直接回傳 **`ans`**。
( 因為 10010 **++11++** 0...，都會出現連續兩個 `1` 的情況，所以不可再判斷。 )

:::success
:warning: 若 `n` 皆無出現連續兩個`1`的情況，回傳 **`ans + 1`**，因為 `n` 本身也是一個答案。
:::




```cpp=1
class Solution {
public:
    int findIntegers(int n) {
        int bit[32];
        bit[0] = 1;
        bit[1] = 2;
        for(int i=2; i<32; i++){
            bit[i] = bit[i-1] + bit[i-2];
        }
        
        int k = 29;
        int pre_bit = 0;
        int ans = 0;
        
        while(k >= 0){
            if(n & (1<<k)){
                ans += bit[k];
                if(pre_bit == 1)    return ans;
                pre_bit = 1;
            }
            else    pre_bit = 0;
            
            k--;
        }

        return ans + 1;
    }
};
```