숫자 n이 있다고 가정합니다. 이진 형식의 n과 1의 개수가 같은 가장 작은 다음 높은 숫자를 찾아야 합니다.
따라서 입력이 n =7과 같으면 출력은 11이 됩니다. 이진법으로 7은 0111이고 7에서 다음으로 높은 값이 3이면 11이 되고 이진법은 1011이 되기 때문입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다.
-
복사 :=n, 0 :=0, 일 :=0
-
복사가 0이 아니고 복사가 짝수인 동안 수행
-
0 :=0 + 1
-
복사 =복사 / 2
-
-
복사가 이상한 동안 수행
-
일 :=일 + 1
-
복사 =복사 / 2
-
-
오른쪽 :=1 + 0
-
n :=n OR (2^오른쪽)
-
n :=n AND 반전 ((2^right) - 1)
-
n :=n OR((2 ^ (일 - 1)) - 1
-
반환 n
더 나은 이해를 위해 다음 구현을 살펴보겠습니다.
예시
class Solution: def solve(self, n): copy = n zeros = 0 ones = 0 while copy and not copy & 1: zeros += 1 copy >>= 1 while copy & 1: ones += 1 copy >>= 1 right = ones + zeros n |= 1 << right n &= ~((1 << right) - 1) n |= (1 << ones - 1) - 1 return n ob = Solution() n = 7 print(ob.solve(n))
입력
7
출력
11