题目:约瑟夫问题是一个非常著名的趣题,即由n个人坐成一圈,按顺时针由1开始给他们编号。然后由第一个人开始报数,数到m的人出局。现在需要求的是最后一个出局的人的编号。
给定两个int n和m,代表游戏的人数。请返回最后一个出局的人的编号。 保证n和m小于等于1000。
这里判断新的起始位置时候需要用当前位置重新对链表长度取余得方式,因为这里不确定是否需要从头开始 测试样例: 输入5 3 返回 4
数学方法判断取出数据得位置: getIndex=(curr+m-1)%len.size();从当前位置开始,取出第m个元素.
为什么这里计算删除元素在链表位置时候要加m-1而不是直接m呢?? 因为,链表中 1代表0号位置啊.......是不是很傻逼得回答,实际上我之前还真迷了一会
public int joseph(int n, int m) {
if (n <= 0||m<=0) {
return -1;
}
LinkedList<Integer> list = new LinkedList<>();//数据链
for (int i = 1; i <= n; i++) {
list.add(i);
}//添数据(小朋友编号)
int index=0;//从链表0位置开始数 m个元素
while (list.size()>1){//只要不是剩最后一个元素就要去数据
int delIndex=(index+m-1)%list.size();//计算删除位置
list.remove(delIndex);//移除
index=(delIndex)%list.size();
//新得起始报数位置,如果delindex删除得不是最后一个元素,其实这里delIndex还是新得起点
// 但是如过它是最后一个元素,那么它得起点应该是第一个元素
//这里就直接用取余操作了
}
return list.peek();
}