在浏览面试题的时候发现了这道题目,百度后整理了一下思绪,觉得网上写的有点繁琐,将自己写的整理如下:
package com.dewen.project;
/**
* 有N个人围成一圈,第一个人从1开始报数,报到M的人出列,求最后一个出列的人
* @author Dewen.Liu
*
*/
public class Play {
public void playGame(int total, int step){
int[] num = new int[total];//创建了一个长度为20的一维数组
/**
* 数组中的初始值都是0;
* 循环数组的时候,当元素要出列的时候,将其对应的数组值设置为1;
* 下次遍历的时候,如果值是一,直接跳过,不计数;
*/
int tep = 0;//记录当前的步数;
int count = 0;//记录循环的总次数
ff:while (true) {
for (int i = 0; i < num.length; i++) {
if (count == total*step) {
break ff;
}
if (step == tep+1 && num[i] == 0) {//当走到了第七步,并且当前元素为0
System.out.print(i+1+" ");//输出当前的元素
num[i]=1;//将当前元素变为1
tep = 0;
}else if (i == num.length) {
i = 0;
}else if(num[i] == 1){
continue;
}else{
tep++;
}
count++;
}
}
}
public static void main(String[] args) {
Play play = new Play();
play.playGame(6, 3);
}
}
存在的缺点是:如果数据量很大,代码效率降低。