前一篇文章最后一个算法校正
前一篇文章最后一个算法的实现有一点问题,问题原因来自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 = 1while_state = 1#逻辑本身还是有问题,应该是每删除一次,就行判断一次,否则会有隐患存在# while len(temp_list) <= 15:while True:if while_state == 0:breakelse:for j in origin_num:if len(temp_list) == 15:while_state = 0breakelse:if s == 9 and j != 0:temp_list.append(j)origin_num[origin_num.index(j)] = 0s = 1elif j == 0:passelse:s += 1print(temp_list)print(len(temp_list))print([i for i in origin_num if i != 0])if __name__ == '__main__':nine_retire()