문제 설명
주어진 범위 [m, n]은 0 <= m <= N <= 2147483647에서, 비트 단위로 돌아가서,이 범위에있는 모든 숫자 포괄적.
예 1 :
입력 : [5,7]
출력 : 4
예 2 :
입력 : [0,1]
출력 : 0
문제 링크
비디오 자습서
여기 상세 비디오 자습서를 찾을 수 있습니다
생각 프로세스
우리가 수를 계속 증가입니다 작업에서 수행하고 AND를하는 것처럼 일반적으로 우리는 단지 구현합니다. 그것은 여전히 OJ를 전달합니다, 단지 상황을 오버플로 관심을 지불 할 필요 (사용하여 긴 문제를 해결할 것입니다)
우리는 그것을 선형 이상을 해결할 수 이제 우리는 자신을 추진하고있다. 이진 선형보다 빠릅니다 / 로그인합니다. 오른쪽 부분은 0으로 끝낼 때문에 - 아이디어는 m 및 n은, 나중에 교대 N (공통 길이 자리 숫자의 총 수)의 공통 왼쪽 비트를 찾는 것이다.
예를 들어, 4 내지 7, thte 공통 왼쪽 부분은 1, 범위 값이 될 것이다 (N 배의 시프트를 남겨) 100
- (1) 00
- (1) 01
- 1 10
- (1) (11)
솔루션
리니어 솔루션
1 개 공용 INT rangeBitwiseAnd ( INT의 m, INT의 N) { 2 // 넘침 방지 3 긴 입술 용 = m을; (4) (5) 에 대한 ( 길이 I = ( 긴 ) m + 1] = 난 (< 길이 ) N; 내가 ++ ) { 6 입술 = 입술 및 I; 7 경우 (입술 == 0) 복귀 0 ; 8 } 9 10 창 ( INT ) 입술; 11 }
시간 복잡도 : O (N) 본질적 N - m
공간 복잡성은 : O (1) 여분의 공간이 필요하지 않습니다
대수 솔루션
1 공용 INT rangeBitwiseAnd ( INT의 m, INT의 N) { 2 경우 (N == m) { 3 창 N; 4 } 5 INT의 자리 = 0 ; 6 동안 (! m = N) { 7 m = >> 1 ; (8) N은 >> = 1 ; 9 자리 ++ ; 10 } 11 12 복귀 m << 자리; 13 }
시간 복잡도 : O (LGN) 우리는 N 2 (왼쪽 시프트)을 나누어 계속하기 때문에
공간 복잡성은 : O (1) 여분의 공간이 필요하지 않습니다