2017实习生在线测评编程题

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);
    }
}

这道题并不算难,仅是阿里的测评编程题,然而考察的是将问题抽象为数据结构的能力。

你可能感兴趣的:(算法题)