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

环形链表的约瑟夫问题

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);
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
05-11 20:45
门头沟学院 Java
有担当的灰太狼又在摸...:零帧起手查看图片
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

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