约瑟夫环Java实现

约瑟夫环描述:编号为0到n-1的n个人围成一圈。从编号为0的人开始报数1,依次下去,报到m的人离开,问最后留下的一个人,编号是多少?
输出描述: 输出最后一个留下来的人的编号
思路一:写一个单向循环链表。每m个就删除一个节点。如果链表中只剩下来最后,那么答案就是它了。
1 构建一个单向循环链表,每一个节点的值是其报数的数字,从1开始。
2 构建一个虚拟头节点,从头结点开始,每m个开始删除。
具体的删除逻辑是使用pre指针来删除。
3 当链表只剩下最后一个,就可以返回该值了

import java.util.*;


public class Solution {
    /**
     * 
     * @param n int整型 
     * @param m int整型 
     * @return int整型
     */
    public int ysf (int n, int m) {
        // write code here
    
        Node head = new Node(-1);  // 虚拟头节点
        Node cur = head;
        for (int i = 1; i <= n; i++){  // 把所有报数都放进链表中
            Node node = new Node(i);
            cur.next = node;
            cur = cur.next;
        }
        cur.next = head.next;  // 单向循环链表
        
        cur = head;  // cur指针重新回来头部
        Node pre = null;
        
        while (cur.next != null){
            int count = m;  // 注意这里每一次都需要更新为m
            while (count-- > 0){
                pre = cur;
                cur = cur.next;
            }
            // 删除这个节点
            pre.next = cur.next;
            cur.next = null;
            cur = pre;
        }
        return cur.val;
        
    }
}

class Node{
    int val;
    Node next;
    Node() {};
    Node(int num) {
        this.val = num;
    }
}  
思路二:使用数组的方法解决
1 将所有的报数都放在一个容器中
2 每一个使用取出下标来删除  (cur + m - 1) 表示要取出来的元素,  % len 是为了防止数组溢出 (这个 % len是解这道题的关键)
3 返回最后一个数。
public class Solution {
     * @param n int整型 
     * @param m int整型 
     * @return int整型
     */
    public int ysf (int n, int m) {
        // write code here
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= n; i++){
            list.add(i);
        }
        int cur = 0;
        while (list.size() > 1){  // 删到只剩下一个元素
            int len = list.size();
            cur  = (cur + m - 1) % len;
            list.remove(cur);
        }
        return list.get(0);
    }
}




#Java##学习路径#
全部评论

相关推荐

不愿透露姓名的神秘牛友
01-17 11:44
你在各大软件投了一份又一份,你打招呼的hr一个接一个,但是只要你投过的,很快就下线了,没关系你的能量是很强,你看过的岗位招到人的速度都增加了。朋友们一个个拿着丰厚的实习回报,你却默默在家刷新邮箱,等待着那寥寥无几的面试通知。你每天一睁眼就狂投简历,你一有面试邀约就点确认。过年亲戚们围坐聊天,谈论着他们孩子的职场成就,你试图插话说自己面试过的公司数量,但他们显然不太感兴趣。你在心里自嘲,觉得他们不懂面试的艰辛、不懂得每一次面试机会的珍贵,不懂得一张张精心准备的简历背后的努力。笑你那个小侄子只会在网上刷刷职位,而你已经是各大招聘网站的常客。亲戚们夸赞自己孩子一年的成就,儿子的新工作,女儿的晋升,而...
龚新化:这帖删了呗,这跟我朋友有点相似,不过我是无所谓的😀,没什么感觉,我不轻易破防的,但是我一个朋友可能有点汗流浃背了😕,他不太舒服想睡了,当然不是我哈,我一直都是行的,以一个旁观者的心态看吧,也不至于破防吧😃,就是想照顾下我朋友的感受,他有点破防了,还是建议删了吧😯,当然删不删随你,因为我是没感觉的,就是为朋友感到不平罢了🥺
点赞 评论 收藏
分享
2024-12-06 10:44
东北财经大学 运营
在拧螺丝的西红柿很热情:工作量数据化,你的实习我只看到了一个30%,比如总浏览量十万加,同比增长20%,用户复购率达到70%等等,自己根据你当时的工作情况挖掘吧
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

更多
牛客网
牛客企业服务