Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 060c684

Browse files
Create Bitwise AND of Numbers Range
1 parent 4d0d611 commit 060c684

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /