面試題-python3 將N(N<10000)個人排成一排,從第1個人開始報數;如果報數是M的倍數就出列


面試題

某大廠迎來了新入職的大學生,現在需要為每個新同事分配一個工號。
人力資源部同事小V設計了一個方法為每個人進行排序並分配最終的工號,具體規則是:
將N(N<10000)個人排成一排,從第1個人開始報數;如果報數是M的倍數就出列,報到隊尾后則回到對頭繼續報, 直到所有人都出列;最后按照出列順序為每個人依次分配工號

報數報到3的退出

100個人圍一圈編號1-100,依次開始報數,
從1開始,報到3的退出,然后繼續從1開始,報到3退出,直到最后只有2個人,得到編號 58, 91
從1開始,報到4的退出,然后繼續從1開始,報到4退出,直到最后只有3個人,得到編號 34, 45, 97

實現效果:
輸入:3
輸出: 58,91
輸入:4
輸出: 34, 45, 97

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

a = list(range(1, 101))
n = 3
while len(a) >= n:
    if n-2 >= 0:
        a = a[n:] + a[:n-1]
print(sorted(a))

跟這題非常類似,不同之處是需要收集出列的小伙伴順序,最后幾個小伙伴需繼續報數,直到最后一個

先出列

假設20個人,報道5的倍數出列,於是可以得到

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

a = list(range(1, 21))
new_arry = []
m = 5

# 1.人數大於等於n
while len(a) >= m:
    new_arry.append(a[m-1])
    a = a[m:] + a[:m-1]

print(a)   # 多余的
print(new_arry)

運行結果:

[2, 7, 8, 14]
[5, 10, 15, 20, 6, 12, 18, 4, 13, 1, 9, 19, 11, 3, 17, 16]

最后還有4個人將繼續報數,

人數小於n的情況

[2,7,8,14]繼續循環[2,7,8,14] 此時 2 出列,剩余[7,8,14]

[7,8,14]繼續循環[7,8,14],此時 8 出列,剩余[7,14]
[14, 7]繼續循環[14,7],此時14出列,剩余[7]
最后一個[7]可以直接取出來了

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
a = list(range(1, 21))
new_arry = []
m = 5

# 1.人數大於等於n
while len(a) >= m:
    new_arry.append(a[m-1])
    a = a[m:] + a[:m-1]

print(a)   # 多余的
# 2.人數小於n
while len(a) < m:
    # 取a的整數倍余數
    m1 = m % len(a)
    if len(a) >= m1:
        new_arry.append(a[m1-1])
        a = a[m1:] + a[:m1-1]
    # 最后一個取出來
    if len(a) == 1:
        new_arry.append(a[0])
        break

print(new_arry)

運行結果

[2, 7, 8, 14]
[5, 10, 15, 20, 6, 12, 18, 4, 13, 1, 9, 19, 11, 3, 17, 16, 2, 8, 14, 7]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM