1.题目
题目描述
现有n个人围坐一圈,顺时针给大家编号,第一个人编号为1,然后顺时针开始报数。第一轮依次报1,2,1,2…没报1的人出局。接着第二轮再从上一轮最后一个报数的人开始依次报1,2,3,1,2,3…没报1的人都出局。以此类推直到剩下以后一个人。现给定一个int n,要求返回最后一个人的编号。
测试样例:
5
返回:5
2.分析
此问题需要将数据构成环,
因此在这里采用链表存储每次没有出局的人
我们首先将1-5号依次放入链表,根据题目要求,需要进行1,2报数,且报数为1的不淘汰,那么通过判断条件将报数为1的加入
2号链表,通过2号链表来保存进入下一轮的人员名单
之后再去判断2号链表即可
代码示例
public class Joseph {
public int getResult(int n) {
LinkedList<Integer> ret = new LinkedList();
for (int i = 1; i <= n; i++) {
ret.addLast(i);
}
int m = 2;
int tmp = 0;
int j = 1;
LinkedList<Integer> ret1 = new LinkedList();
LinkedList<Integer> ret2 = new LinkedList();
while (ret.size() != 1) {
for (; j <= ret.size(); j++) {
if (j % m == 1) {
ret1.addLast(ret.get(j-1));
}
}
tmp = ret1.getLast();
ret1.removeLast();
ret1.addFirst(tmp);
ret2 = (LinkedList<Integer>) ret1.clone();
ret1.clear();
ret=ret2;
m+=1;
j=1;
}
return ret.getFirst();
}
}