面試題-python3 100個人圍一圈編號1-100,依次開始報數報到3的退出


python測開筆試題

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

python3代碼

解決思路,先把1-100編號,前面的99個單獨取出來(能數到1-3),最后一個100,由於只有一個了,先單獨拿出來
下一步前99個,數到3的移除,得到一個新的列表編號
把100和新的列表編號拼接到一塊,這樣可以進行下一輪的報數

n = 3  # 報的數
a = list(range(1, 101))  # 編號1-100
# 取出最后的余數
end_a = a[len(a)//n*n:]   # 多余的
start_a = a[:len(a)//n*n]
# print(start_a)
# print(end_a)
i = n
while i <= len(start_a):
    # 每隔3移除掉
    start_a.remove(start_a[i-1])
    i = (i-1) + n
# 多余的數拼接到前面,等下次繼續
new_a = end_a+start_a
# 第一輪移除后得到新的列表
print(new_a)
# 得到新的列表:[100, 1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 
19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, 
43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 62, 64, 65, 
67, 68, 70, 71, 73, 74, 76, 77, 79, 80, 82, 83, 85, 86, 
88, 89, 91, 92, 94, 95, 97, 98]

得到新的列表后,繼續重復上面的操作,於是可以寫個遞歸函數,直到列表數小於3為止

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

def remove_n(a, n=3):
    if len(a) < n:
        return sorted(a)
    # a = list(range(1, 101))
    # 取出最后的余數
    end_a = a[len(a)//n*n:]
    start_a = a[:len(a)//n*n]
    # print(start_a)
    # print(end_a)
    i = n
    while i <= len(start_a):
        start_a.remove(start_a[i-1])
        i = (i-1) + n
    new_a = end_a+start_a
    # print(new_a)
    return remove_n(new_a, n)

if __name__ == '__main__':
    a = list(range(1, 101))
    n1 = input()
    result1 = remove_n(a, int(n1))
    print(result1)
    n2 = input()
    result2 = remove_n(a, int(n2))
    print(result2)

實現效果:

3
[58, 91]
4
[34, 45, 97]

精簡方法

群里小伙伴提供的方法,此法甚妙!

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

運行結果:[58, 91]

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

運行結果:[34, 45, 97]
作者-上海悠悠 blog地址 https://www.cnblogs.com/yoyoketang/


免責聲明!

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



猜您在找 C# 有N個人圍成一圈,第一個人從1開始報數,報到M的人出列,求依次出列的人的編號 C語言 約瑟夫圈問題:N個人圍成一圈,從第一個人開始按順序報數並編號1,2,3,……N,然后開始從第一個人轉圈報數,凡是報到3的退出圈子。則剩下的最后一個人編號是多少。 有10個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是第幾號的人 有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來的第幾號的那位。 有n個人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位 有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。 有n個人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位 有n個人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位 有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。 python 實現:題目:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM