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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值