多个人围成一圈报数,数到固定值的人出列,求最后剩下的人
2016-09-29 11:07
239 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">1.问题描述</span>
多个人围成一圈,按顺序排号,从某一个人开始进行报数,报数为某固定值的人退出圈子,则最后留下的人是原来的哪号人
2.算法解析
新建数组,将符合条件的人出列,剩下的最后一个人是符合条件的人
3.算法编写
//n个人围成一个圈,从第start人开始报数1,数到mark的人退出,继续数,直到最后剩一个人,获取最后一个人序列号
public static int getLastNum(final int n,int mark,int start){
LinkedList<Integer> list=new LinkedList<Integer>();
for (int i = 1; i <=n; i++)
list.add(i);
int index=start-1;//第几个人开始报数
while(list.size()>1){
index+=mark-1;//删除后元素都往前移动了一位
if(index>=list.size())
index%=list.size();
list.remove(index);
}
return list.get(0);
}
4.算法测试
<span style="white-space:pre"> </span>public static void main(String[] args) {
Random random=new Random();
int count=20;//测试20组数据
while (count-->0) {
int n=random.nextInt(50)+1;//最少一个人
int mark=random.nextInt(100)*n/100+1;//最少为1
int start=random.nextInt(100)*n/100+1;//最少从第一个人开始
System.out.printf("n:%-3d mark:%-3d start:%-3d\nlast:%-3d\n",n,mark,start,getLastNum(n, mark,start));
}
}
5.测试结果校验
n:40 mark:34 start:12
last:35
n:50 mark:40 start:23
last:14
n:20 mark:19 start:9
last:19
n:39 mark:28 start:7
last:11
n:38 mark:29 start:27
last:5
n:9 mark:8 start:8
last:1
n:18 mark:16 start:14
last:3
n:34 mark:4 start:11
last:32
n:31 mark:4 start:17
last:26
n:18 mark:9 start:16
last:5
n:25 mark:13 start:1
last:14
n:10 mark:7 start:2
last:10
n:47 mark:16 start:42
last:47
n:46 mark:24 start:29
last:35
n:28 mark:27 start:1
last:25
n:30 mark:29 start:1
last:25
n:10 mark:4 start:10
last:4
n:40 mark:19 start:11
last:16
n:40 mark:5 start:22
last:37
n:16 mark:16 start:7
last:1
多个人围成一圈,按顺序排号,从某一个人开始进行报数,报数为某固定值的人退出圈子,则最后留下的人是原来的哪号人
2.算法解析
新建数组,将符合条件的人出列,剩下的最后一个人是符合条件的人
3.算法编写
//n个人围成一个圈,从第start人开始报数1,数到mark的人退出,继续数,直到最后剩一个人,获取最后一个人序列号
public static int getLastNum(final int n,int mark,int start){
LinkedList<Integer> list=new LinkedList<Integer>();
for (int i = 1; i <=n; i++)
list.add(i);
int index=start-1;//第几个人开始报数
while(list.size()>1){
index+=mark-1;//删除后元素都往前移动了一位
if(index>=list.size())
index%=list.size();
list.remove(index);
}
return list.get(0);
}
4.算法测试
<span style="white-space:pre"> </span>public static void main(String[] args) {
Random random=new Random();
int count=20;//测试20组数据
while (count-->0) {
int n=random.nextInt(50)+1;//最少一个人
int mark=random.nextInt(100)*n/100+1;//最少为1
int start=random.nextInt(100)*n/100+1;//最少从第一个人开始
System.out.printf("n:%-3d mark:%-3d start:%-3d\nlast:%-3d\n",n,mark,start,getLastNum(n, mark,start));
}
}
5.测试结果校验
n:40 mark:34 start:12
last:35
n:50 mark:40 start:23
last:14
n:20 mark:19 start:9
last:19
n:39 mark:28 start:7
last:11
n:38 mark:29 start:27
last:5
n:9 mark:8 start:8
last:1
n:18 mark:16 start:14
last:3
n:34 mark:4 start:11
last:32
n:31 mark:4 start:17
last:26
n:18 mark:9 start:16
last:5
n:25 mark:13 start:1
last:14
n:10 mark:7 start:2
last:10
n:47 mark:16 start:42
last:47
n:46 mark:24 start:29
last:35
n:28 mark:27 start:1
last:25
n:30 mark:29 start:1
last:25
n:10 mark:4 start:10
last:4
n:40 mark:19 start:11
last:16
n:40 mark:5 start:22
last:37
n:16 mark:16 start:7
last:1
相关文章推荐
- n个人排成一圈,从1到3报数,数到3的人出列,输出最后剩下的哪个人是原来的第几号
- n 个人围成一圈(编号1-n),数到3的出列,最后剩下的人的编号
- 50个人围成一圈报数,遇到3的倍数,自动退出,最后剩下的人原来的位置是多少
- N个人围成一圈报数,报到某一个数m的就出局,问你最后剩下来的人的号码?
- 约瑟夫问题(n个人围圈报数,报m出列,最后剩下的是几号?)
- n 个人围成一圈(编号1-n),数到3的出列,最后剩下的人的编号
- 有n个人围成一圈,从第1个人开始,1、2、3报数,报至3出局,余下的人继续从1、2、3报数,问:最后剩下的一人是原来的第几号?同时求出被淘汰编号的序列。(要求:用循环队列解决该问题。)
- n个人围成一圈,从第一个人开始123报数,报到3的离开,问最后剩下的人是第几个?
- java 有n个人围成一圈,从第1个人开始,1、2、3报数,报至3出局,余下的人继续从1、2、3报数,问:最后剩下的一人是原来的第几号?同时求出被淘汰编号的序列
- n个人围成一圈报数,从1报到3,报到3的人退出,然后依次循环,直到剩下最后一人,这人是第几个人?
- 环形链表 有m个人围成一圈,开始报数,报道n,退出,问最后剩下的是几号。
- N个人围成一圈,顺序排号,报号出列。求最后出来及剩下的孩纸?
- 【算法】n个人围成一圈报数,报到3的退出,下面接着从1开始报,问最后剩下的是谁?
- 2. 题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位. 提示:用数组完成
- 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出, 然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
- 设有n个人依围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列, …,如此反复到所有的人全部出列为止。设n个人的编号分别为 1, 2, …, n,打印出出
- 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
- n个人围成一圈报数出列
- js解决N个人围成一圈,第一个人从1开始报数,报到M的人出列,求最后一个出列的人的编号。
- 有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位