두 개의 값 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