前一篇文章最后一个算法的实现有一点问题,问题原因来自python中list删除数据会导致数据前移,针对这个特性目前没有一个很好的解决方案,所以在这里使用另外一个角度去实现,即将报到9的人编号置为0,在下次喊的时候,让为0的结果直接pass即可。里边还有一个设置状态量让while循环退出的思想。
#从30个人中选择15个,所有人围成一圈数1-9的数,喊到9的人出列即可 #让每个人报数,按照1-9对每次报数的人进行记录,将报到9的人剔除即可(在这里其实也是用基础的排序,即30人的编号作为起始的编号,主要信息:初始化编号和每个人所报数字,且每报到9后需要重新从1开始报数) import sys def nine_retire(): origin_num = [i for i in range(1,31)] temp_list = [] s = 1 while_state = 1 #逻辑本身还是有问题,应该是每删除一次,就行判断一次,否则会有隐患存在 # while len(temp_list) <= 15: while True: if while_state == 0: break else: for j in origin_num: if len(temp_list) == 15: while_state = 0 break else: if s == 9 and j != 0: temp_list.append(j) origin_num[origin_num.index(j)] = 0 s = 1 elif j == 0: pass else: s += 1 print(temp_list) print(len(temp_list)) print([i for i in origin_num if i != 0]) if __name__ == '__main__': nine_retire()