题目描述
约瑟夫问题是一个非常著名的趣题,即由n个人坐成一圈,按顺时针由1开始给他们编号。然后由第一个人开始报数,数到m的人出局。现在需要求的是最后一个出局的人的编号。
给定两个int n和m,代表游戏的人数。请返回最后一个出局的人的编号。保证n和m小于等于1000。
测试样例:
5 3
返回:4
思路:把所有的数用链表存,然后把链表置为环。
依次计数,等于m-1时就知道它后面的数就是要删的数了,直接当前指针指向后面第二个结点,就删除了。这时要把index置为0;因为后面数的数又是1了。
import java.util.*;
public class Joseph {
public int getResult(int n, int m) {
// write code here
ListNode head = new ListNode(0);
ListNode first = head;
for(int i=1;i<=n;i++){
ListNode node = new ListNode(i);
head.next = node;
head = head.next;
}
//将头和尾连起来形成环
head.next = first.next;
head = first.next;
int index = 1;
while(head.next!=head){
if(index==m-1){
head.next = head.next.next;
index = 0;
}
index++;
head = head.next;
}
return head.val;
}
}