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

环形链表的约瑟夫问题

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

相关推荐

在看牛客的社畜很积极:身高体重那一行信息去掉,学校那一行的信息放上面,找半天都没找到你是哪个学校什么专业的
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

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