양의 정수 N이 있다고 가정하고 N의 이진 표현에서 두 개의 연속 1 사이의 가장 긴 거리를 찾아야 합니다. 두 개의 연속 1이 없으면 0을 반환합니다.
따라서 입력이 22와 같으면 출력은 2가 됩니다. 이진법의 22는 10110이기 때문입니다. 22의 이진법 표현에는 세 개의 1이 있고 1의 두 개의 연속 쌍이 있습니다. 첫 번째 연속 쌍의 거리가 2이고 두 번째 연속 1 쌍의 거리가 1입니다. 답변은 이 두 거리 중 가장 큰 거리인 2가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- K :=N의 이진 표현 비트 목록 만들기
- 최대:=0, C:=0, S:=0
- 플래그 :=거짓
- 0에서 K 크기의 범위에 있는 i에 대해 다음을 수행합니다.
- K[i]가 '1'이고 C가 0이고 플래그가 False이면
- C:=나
- 플래그 :=참
- 그렇지 않으면 K[i]가 '1'이고 플래그가 지정되면
- S:=나
- 최대
- 최대 :=|S-C|
- C:=S
- K[i]가 '1'이고 C가 0이고 플래그가 False이면
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
class Solution: def binaryGap(self, N): B = bin(N).replace('0b','') K = str(B) K = list(K) Max = 0 C = 0 S =0 Flag =False for i in range(len(K)): if K[i] is '1' and C is 0 and Flag is False: C=i Flag = True elif K[i] is '1' and Flag: S=i if Max<abs(S-C): Max = abs(S-C) C=S return Max ob = Solution() print(ob.binaryGap(22))
입력
22
출력
2