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/