ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python3面试-将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列

2021-06-05 23:01:22  阅读:266  来源: 互联网

标签:10 10000 newl len while print 报数 python3 out


面试题

某大厂迎来了新入职的大学生,现在需要为每个新同事分配一个工号。

人力资源部同事设计了一个方法为每个人进行排序并分配最终的工号,具体规则是:

将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列,报到队尾(最后一位),则从头(回到对头)继续报,直到所有人都出列;最后按照出列顺序为每个人依次分配工号

 

思考

先出列,即将原数组中的该数字删除,先循环每位上的数字,可以和M除的尽,则出列;

如何维护原数列呢?若采用删除的办法,数列的长度会变,这样循环位置就不可以了,苦思冥想半天,无果;百度,维护原数列,采用切片的方式,终于ok;

先出列

假设10个人,报道3的倍数就出列

l=list(range(1,11))
n=3
newl=[]
while len(l)>=n:
    newl.append(l[n-1])
    l=l[n:]+l[:n-1]
print(l) #多余的
print(newl) #新数列

 运行结果:

[10, 4]
[3, 6, 9, 2, 7, 1, 8, 5]

 最后还剩2个人将继续报数;

人数小于n的情况

先循环[10,4],继续循环[10,4],此时10出列,剩余4; 

思考:所以当时采用减法,3-2=1,所以直接取列表的第1位;

           后面发现,若是剩余4位,取10的倍数,此方法就不可行,最后改为取余数;

l=list(range(1,11))
n=3
newl=[]
while len(l)>=n:
    newl.append(l[n-1])
    l=l[n:]+l[:n-1]
print(l) #多余的
print(newl) #新数列

while len(l)>1:#因为前面已经知道未分配的<out,不过为了保险起见,可以加上<的条件;
    a=n-len(l)
    newl.append(l[a-1])
    l=l[a:]+l[:a-1]
print(newl)
print(newl+l)

 练习:20个人,5的倍数出列

l=list(range(1,21))
newl=[]
out=5

while len(l)>=out:
    newl.append(l[out-1])
    l=l[out:]+l[:out-1] #切片左包,右不包
print(l) #剩余未被分配的
#print(newl) #新的排序

while len(l)>1:
    p=out%len(l)
    newl.append(l[p-1])
    l=l[p:]+l[:p-1]
print(l) #此时还剩余1个为分配
#print(newl) #新的排序
print(newl+l)#终极排序

 运行结果

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

  

  

  

  

 

 

标签:10,10000,newl,len,while,print,报数,python3,out
来源: https://www.cnblogs.com/canglongdao/p/14854111.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有