题解 | #环形链表的约瑟夫问题#

环形链表的约瑟夫问题

http://www.nowcoder.com/practice/41c399fdb6004b31a6cbb047c641ed8a

利用报数的性质确定本轮淘汰的人员的索引,将其删除后,进行下一轮报数,直到剩下最后一个人

import java.util.*;
public class Solution {
    /**
     * 
     * @param n int整型 
     * @param m int整型 
     * @return int整型
     */
    public int ysf (int n, int m) {
        // write code here
        ArrayList<Integer> list = new ArrayList<Integer>();
        // 先构造该数组序列
        for(int i = 1; i <= n; i++){
            list.add(i);
        }
        // 第一次从索引为0处进行报数
        int id = 0;
        // 直到剩最后一个人的时候停止循环
        while(n > 1){
            // 从开始报数的索引处向后数m-1个人即是被淘汰的人的索引处
            id = (id + m -1) % n;
            // 将被淘汰的人删除掉
            list.remove(id);
            // 将人数减1
            n--;
        }
        // 最后剩下的一个人即是最终的获胜者
        return list.get(0);
    }
}
全部评论

相关推荐

02-14 12:40
门头沟学院 Java
程序员花海:1.面试要求必须Java笔试不一定 2.难度对等秋招 远超于日常实习是因为同一批次且转正很多 竞争压力大 3.第一个加点指标,上线了就把接口性能加上去 使用本地缓存这个不算亮点 只是技术选型,要把为什么采用这个和背后的思考写出来而不是单纯堆叠技术没意义 4.八股要一直看 很容易忘记 5.拼团交易这个老问题 堆积技术 另外建议你把奖项合并到教育背景 没必要拆出来放最后
我的简历长这样
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务