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

k 크기의 1에서 n까지의 k번째 사전 순서를 찾는 프로그램 Python

<시간/>

두 개의 값 n과 k가 있다고 가정합니다. 이제 범위 1에서 n까지의 숫자 목록 [1, 2, ..., n]을 고려하고 이 목록의 모든 순열을 사전순으로 생성합니다. 예를 들어, n =4라면 [1234, 1243, 1324, 1342, 1423, 1432, 2134, 2143, 2314, 2341, 2, 2413, 2431, 3124, 3142, 3 4213, 4231, 4312, 4321]. 이 순열 시퀀스의 k번째 값을 문자열로 찾아야 합니다.

따라서 입력이 n =4 k =5와 같으면 출력은 "1432"가 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 함수 factor()를 정의합니다. 시간이 걸립니다

  • quo :=숫자

  • res :=이중 종료 대기열 및 시작 부분에 0 삽입

  • 나는 :=2

  • quo가 비어 있지 않은 동안 수행

    • quo :=(quo / i)의 몫, rem :=quo mod i

    • res의 왼쪽에 rem 삽입

    • 나는 :=나는 + 1

  • 반환 해상도

  • 주요 방법에서 다음을 수행하십시오 -

  • 숫자 :=1부터 n까지의 값을 가진 목록

  • res :=빈 문자열

  • k_fact :=요인(k)

  • k_fact의 크기 <숫자의 크기, do

    • res :=res 숫자의 첫 번째 요소를 문자열로 연결한 다음 숫자의 첫 번째 요소 삭제

  • k_fact의 각 인덱스에 대해 수행

    • number :=index-숫자 요소를 제거한 다음 해당 요소를 제거합니다.

    • res :=res 연결 번호

  • 반환 해상도

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

from collections import deque
def factors(num):
   quo = num
   res = deque([0])
   i = 2
   while quo:
      quo, rem = divmod(quo, i)
      res.appendleft(rem)
      i += 1
   return res
class Solution:
   def solve(self, n, k):
      numbers = [num for num in range(1, n + 1)]
      res = ""
      k_fact = factors(k)
      while len(k_fact) < len(numbers):
         res += str(numbers.pop(0))
      for index in k_fact:
         number = numbers.pop(index)
         res += str(number)
      return res
ob = Solution()
n = 4
k = 5
print(ob.solve(n, k))

입력

4, 5

출력

1432