Java经典面试题(N人循环报M个数出列)实现

面试题:

 设有N个人依次围成一圈,从第1个人开始报数,第M个人出列,然后从出列的下一个人开始报数,数到第M个人又出列,...,如此反复到所有的人全部出列为止,设N个人的编号分别为1,2,...,N,打印出出列的顺序,要求用java实现。


参考代码:

package com;


/*
 *  编程题:设有N个人依次围成一圈,从第1个人开始报数,第M个人出列,然后从出列的下一个人开始报数,数到第M个人又出列,...,
 *  如此反复到所有的人全部出列为止,设N个人的编号分别为1,2,...,N,打印出出列的顺序,要求用java实现。
 */
public class demo {
	public static void main(String args[]){
		int n=99;//人数,1...99编号
		int m=9;//循环次数
		int oCount=0;//统计总出列人数
		int index=1;//指示当前报数的编号
		int iCount=0;//统计每一轮循环报数的个数
		int[] icol=new int[99];
		for(int i=0;i<99;i++) icol[i]=0;//初始化为未出列	
		long start=System.currentTimeMillis();  
		while (true){
			if(oCount==n-1) { //剩下最后一个,直接出列
				System.out.println("最后,第"+String.valueOf(index)+"个出列!");			
				break;//全部出列,结束循环
			}
			
			if(icol[index-1]==0) iCount++;//未出列,报数
			
			if(iCount == m )	{ //本轮报数循环结束	
				System.out.println("第"+String.valueOf(index)+"个出列!");
				icol[index-1]=1;//标记为已出列
				oCount++;//已处理人数加1
				iCount =0;//从头开始数每轮循环报数
			}
			
			index++;//下一个
			if(index==n) index=1;//返回队头
		}	
		long end =System.currentTimeMillis();
		System.out.println("总出列个数:"+String.valueOf(oCount+1));
		System.out.println("总时长:"+String.valueOf(end-start));
	}
}
执行结果:

第9个出列!
第18个出列!
第27个出列!
第36个出列!
第45个出列!
第54个出列!
第63个出列!
第72个出列!
第81个出列!
第90个出列!
第1个出列!
第11个出列!
第21个出列!
第31个出列!
第41个出列!
第51个出列!
第61个出列!
第71个出列!
第82个出列!
第92个出列!
第4个出列!
第15个出列!
第26个出列!
第38个出列!
第49个出列!
第60个出列!
第73个出列!
第84个出列!
第95个出列!
第8个出列!
第22个出列!
第34个出列!
第47个出列!
第59个出列!
第74个出列!
第86个出列!
第98个出列!
第14个出列!
第29个出列!
第43个出列!
第57个出列!
第70个出列!
第87个出列!
第3个出列!
第19个出列!
第35个出列!
第52个出列!
第67个出列!
第83个出列!
第2个出列!
第20个出列!
第39个出列!
第56个出列!
第76个出列!
第93个出列!
第13个出列!
第33个出列!
第55个出列!
第77个出列!
第96个出列!
第23个出列!
第44个出列!
第66个出列!
第89个出列!
第16个出列!
第42个出列!
第68个出列!
第94个出列!
第25个出列!
第53个出列!
第80个出列!
第12个出列!
第48个出列!
第79个出列!
第17个出列!
第58个出列!
第91个出列!
第32个出列!
第75个出列!
第24个出列!
第65个出列!
第10个出列!
第69个出列!
第30个出列!
第88个出列!
第50个出列!
第28个出列!
第5个出列!
第85个出列!
第78个出列!
第97个出列!
第7个出列!
第46个出列!
第37个出列!
第40个出列!
第6个出列!
第62个出列!
第64个出列!
最后,第65个出列!
总出列个数:99
总时长:7



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值