두 개의 정수 N과 K가 있다고 가정합니다. 비트 단위 OR이 K와 동일한 N개의 고유한 값을 찾아야 합니다. 그러한 결과가 없으면 -1을 반환합니다.
따라서 입력이 N =4 및 K =6과 같으면 출력은 [6,0,1,2]가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
최대 :=32
-
방문:=MAX 크기 목록 및 False로 채우기
-
res :=새 목록
-
add() 함수를 정의합니다. 시간이 걸립니다
-
포인트 :=0
-
값 :=0
-
범위 0에서 MAX까지의 i에 대해 수행
-
방문[i]이 0이 아니면
-
다음 반복으로 이동
-
-
그렇지 않으면
-
num AND 1이 0이 아닌 경우
-
값 :=값 +(2^i)
-
-
num :=num/2 (정수 부분만 사용)
-
-
-
res의 끝에 값 삽입
-
기본 방법에서 다음을 수행하십시오 -
-
pow2 :=2^0에서 2^31까지 2의 거듭제곱 배열
-
res의 끝에 k 삽입
-
cnt_k :=k의 비트 수
-
pow2[cnt_k]
-
반환 -1
-
-
개수 :=0
-
범위 0에서 pow2[cnt_k] - 1에 있는 i에 대해 수행
-
추가(i)
-
개수 :=개수 + 1
-
count가 n과 같으면
-
루프에서 나오다
-
-
-
반환 해상도
예
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
MAX = 32 visited = [False for i in range(MAX)] res = [] def set_bit_count(n): if (n == 0): return 0 else: return (n & 1) + set_bit_count(n >> 1) def add(num): point = 0 value = 0 for i in range(MAX): if (visited[i]): continue else: if (num & 1): value += (1 << i) num = num//2 res.append(value) def solve(n, k): pow2 = [2**i for i in range(MAX)] res.append(k) cnt_k = set_bit_count(k) if (pow2[cnt_k] < n): return -1 count = 0 for i in range(pow2[cnt_k] - 1): add(i) count += 1 if (count == n): break return res n = 4 k = 6 print(solve(n, k))
입력
4, 6
출력
[6, 0, 1, 2]