Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 비트 Or가 K와 동일한 N개의 고유한 숫자 찾기


두 개의 정수 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]