N个人抢红包,依次抢得1元、5元、10元,此外还有10000元的最终大红包,现规定,抢到10元的人不再参与之后的活动,从下一个人接着开始。而最终留下的人获得10000元红包。问最终获得10000红包的是哪个人。
输入:人数N
输出:最终获得大红包那个人的编号
例如:输入40,输出28.
import java.util.*;
// 链表类型
class ListNode{
int value = -1;
ListNode(int i){value = i;}
ListNode next;
}
public class Main{
public static void main(String[] args){
Scanner s = new Scanner(System.in);
int N = s.nextInt();
// 设置第一个节点
ListNode n1 = new ListNode(1);
ListNode prev = n1;
// 把每个人的号码放进节点
for(int i=2; i<=N; i++){
ListNode n = new ListNode(i);
prev.next = n;
prev = n;
}
prev.next = n1; // 循环链表,将最后一个人与第一个相连
// 连接顺序:head->prev->cur->post,消掉第三个节点即cur
int result = 0;
ListNode head = n1;
ListNode cur,post;
while(true){
if(head.next == head){
//System.out.println("over");
result = head.value;
break;
}else{
prev = head.next; // 第二个节点
cur = prev.next; // 第三个节点,待删除
post = cur.next; // 下一组开始节点
prev.next = post;
head = post;
}
}
System.out.println(result);
}
}
这道题并不算难,仅是阿里的测评编程题,然而考察的是将问题抽象为数据结构的能力。