[programmers/CodingTest/Python]キュー方法
3714 ワード
問題の説明
n人が一列に並んでいます.n人の番号は1番からn番までです.n個人で並ぶ方法はいろいろあります.たとえば、3人がいる場合は、次の6つの方法があります.
人の数nと自然数kが与えられた場合、予め順番に人を列挙する方法を完了した場合、k回の方法の解関数を返します.
せいげんじょうけん
nは20未満の自然数である.
kはnだ!以下は自然数です.
I/O例
n k result
3 5 [3,1,2]
I/O例説明
I/O例#1
問題の例.
方法
最初にitertoolsの配列を使用してすべての状況を求め、ソートしてk-1インデックスにアクセスします.問題はよく解決されたが、効率考課は一つも合格しなかった.
次いで、置換を再帰関数で実装し、結果リストの長さがkより大きい場合、再帰関数を終了する.しかし、この方法もよく解決されなかった.
最後に他の人の解答を参考にして、特定のルールで解決するのを見ました.
k//tmp
に更新します.k%tmp
を入れ、0でなければnums[idx-1]
を入れる.solution.py def solution(n, k):
answer = []
nums=[i for i in range(1, n+1)]
while n!=0:
tmp=1
for i in range(1, n):
tmp*=i
idx=k//tmp
k%=tmp
if k==0:
answer.append(nums.pop(idx-1))
else:
answer.append(nums.pop(idx))
n-=1
return answer
Reference
この問題について([programmers/CodingTest/Python]キュー方法), 我々は、より多くの情報をここで見つけました
https://velog.io/@xx0hn/Programmers-CodingTest-Python-줄-서는-방법
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
def solution(n, k):
answer = []
nums=[i for i in range(1, n+1)]
while n!=0:
tmp=1
for i in range(1, n):
tmp*=i
idx=k//tmp
k%=tmp
if k==0:
answer.append(nums.pop(idx-1))
else:
answer.append(nums.pop(idx))
n-=1
return answer
Reference
この問題について([programmers/CodingTest/Python]キュー方法), 我々は、より多くの情報をここで見つけました https://velog.io/@xx0hn/Programmers-CodingTest-Python-줄-서는-방법テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol