#数据结构与算法学习笔记#剑指Offer44:圆圈中最后剩下的数字(约瑟夫环问题) + 公式证明 + 测试用例(Java、C/C++)

博客介绍了约瑟夫环问题,通过程序模拟和数学公式推导两种方法求解。提供Java和C/C++实现,并包含测试用例。该问题涉及数据结构与算法,属于智力挑战类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2019.1.10     《剑指Offer》从零单刷个人笔记整理(66题全)目录传送门​​​​​​​

这道题和之前的青蛙跳台阶问题( #数据结构与算法学习笔记#剑指Offer8:普通青蛙跳台阶+变态青蛙跳台阶+最清晰数学归纳法证明(Java、C/C++))有点像,都是很有意思的智力题,并且都可以靠程序模拟过程求解或者通过数学证明求相应的公式解两种做法。记得很小的时候就在那些头脑风暴书上看过这些题,印象很深但是解析却似懂非懂的。现在有机会捡起来模拟和推导一遍,有一种温故知新的感觉。

本题其实是一个约瑟夫(Josephuse)环问题,可以靠程序模拟或者公式推导来求解。

方法一(过程模拟):

在纸上稍微画画模拟一下,很容易知道,每一次要移去的数字的位置loc_new与起始位置loc_old和当前总数字个数n_new有关。loc_new = (loc_old + m - 1)% n_new,其中,最开始的起始位置为0,之后每一次的起始位置为loc_new(原数字被删除后loc_new自动指向下一个数字)。找到了这个规律之后,用一个LinkedList配合一个简单的循环即可模拟。

方法二(公式推导):

设关于n和m的约瑟夫环每次删除第m个数字之后剩下的数字为F(n)。

从0起始,第一次被删除的数字k = (m - 1) % n。

删除这个数字后,新的序列起始位置从k+1开始。

新序列:k+1, k+2, …… , n-1, 0, 1,……, k-1

映射关系:0, 1, …… , n-k-2, n-k-1, n-k, ……, n-2

注意观察映射对 n-1 → n-k-2,可以推出,新序列的x对应旧序列的(x+k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值