|
| 1 | +想法:left ... right 的 AND 值一定小於等於 left,且我們只需考慮 left ... right 之間是否有任何一個元素在第 i 個 bit 上為零即可 |
| 2 | +因此只需看過每個 bit 並構造下一個該 bit 為零的元素(需大於left),紀錄答案並輸出 |
| 3 | + |
| 4 | +注意:構造時可能會超出整數範圍,所以要用 long long int 儲存 |
| 5 | + |
| 6 | +Time Complexity : O(log(right)) for using O(log(right)) bits to store right and left |
| 7 | +Space Complexity : O(1) for variables |
| 8 | + |
| 9 | +class Solution { |
| 10 | +public: |
| 11 | + int rangeBitwiseAnd(int left, int right) { |
| 12 | + int ans = left ; |
| 13 | + for(int i = 0 ; i < 31 ; i++) { |
| 14 | + if ( ans & (1 << i) ) { |
| 15 | + long long int nexthavezero |
| 16 | + = (long long int)left + (1 << i) - (left % (1 << i)); |
| 17 | + if ( nexthavezero <= right ) |
| 18 | + ans &= nexthavezero ; |
| 19 | + } |
| 20 | + } |
| 21 | + return ans ; |
| 22 | + } |
| 23 | +}; |
| 24 | + |
| 25 | +// 法二:我們可想成要在 left ... right 中找出共同前綴,而所有數字的共同前綴就等於left , right 的共同前綴 |
| 26 | +找出兩者的共同前綴並輸出即可 |
| 27 | + |
| 28 | +Time Complexity : O(log(right)) for there are O(log(right)) bits |
| 29 | +Space Complexity : O(1) for variables |
| 30 | + |
| 31 | +class Solution { |
| 32 | +public: |
| 33 | + int rangeBitwiseAnd(int left, int right) { |
| 34 | + int shift = 0 ; |
| 35 | + while (left < right) { |
| 36 | + left >>= 1 ; |
| 37 | + right >>= 1 ; |
| 38 | + shift++ ; |
| 39 | + } |
| 40 | + return left << shift ; |
| 41 | + } |
| 42 | +}; |
0 commit comments