首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
环形链表的约瑟夫问题(进阶)
[编程题]环形链表的约瑟夫问题(进阶)
热度指数:1928
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 256M,其他语言512M
算法知识视频讲解
据说著名犹太历史学家 Josephus 有过以下故事:在罗马人占领乔塔帕特后,39 个犹太人与 Josephus 及他的朋友躲到一个洞中,39 个犹太人决定宁愿死也不要被敌人抓到,于是决定了一种自杀方式,41 个人排成一个圆圈,由第 1 个人开始报数,报数到 3 的人就自杀,然后再由下一个人重新报 1,报数到 3 的人再自杀,这样依次下去,直到剩下最后一个人时,那个人可以自由选择自己的命运。这就是著名的约瑟夫问题。
现在请用单向环形链表得出最终存活的人的编号
。
输入描述:
一行两个整数 n,m,n 表示链表的长度,m 表示每报数到 m 就自杀。
输出描述:
输出最后存活的人的编号(编号从 1 开始到 n)。
示例1
输入
5 2
输出
3
备注:
马上挑战
算法知识视频讲解
提交运行
算法知识视频讲解
添加笔记
求解答(5)
邀请回答
收藏(14)
分享
纠错
提交结果有问题?
8个回答
2篇题解
开通博客
Huster水仙
发表于 2023-02-13 22:28:53
约瑟夫问题递推法 模拟的时间开销太大 不得不回头考虑递推关系: 将编号改为从0开始,记f(n,m)为原问题的解 由于第一次遍历了0~(m-1)%n,则第二次遍历相当于将整个队伍循环左移了k位(k=m%n) 所以子问题f(n-1,m)的解循环右移k位即为原问题的解f(n,m) f(n,
展开全文
热爱洗屁屁的羊
发表于 2021-07-18 02:36:40
约瑟夫问题:在n个人中(编号为1~n),从第一个人开始数数,每当计数为m时,此人为A,A自杀踢出;然后下一个从新从1开始计数,当再次数到m时,此人为B,B自杀踢出。当最后剩下一人时结束。 模型等化:将n个人等效为一个环形链表。每次踢出一个人时,链表长度就减小1。 方法一:递归方法利用递归方法计算存活
展开全文
问题信息
链表
数学
上传者:
小小
难度:
8条回答
14收藏
6020浏览
热门推荐
通过挑战的用户
查看代码
xiaojunjun
2023-02-26 20:27:19
Huster水仙
2023-02-13 22:30:36
captain...
2023-02-11 16:38:04
Radicals.
2023-02-01 17:13:57
Dust-Heart
2022-09-14 20:21:40
相关试题
有关阶乘的两个问题1
数学
基础数学
评论
(3)
一行代码求两个数的最大公约数
数学
基础数学
评论
(12)
打气球的最大分数
动态规划
数学
评论
(12)
模型稀疏化(Pruning)技术主...
大模型概念
评论
(1)
以下哪种方法主要用于缓解大模型训练...
大模型概念
评论
(1)
环形链表的约瑟夫问题(进阶)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题
5 2
3