给定整数m、n的数组循环删数问题:m=7、n=4返回值是否应为2?
约瑟夫环问题结果验证
结论:你提到的示例标注的返回值3是错误的,该场景下的正确返回值确实为2,示例给出的移除序列本身存在推导错误。
逐轮模拟验证
我们按照「每次从被移除元素的下一个位置开始数,数到第4个元素移除」的规则,逐轮推导:
- 初始状态:数组为
[1,2,3,4,5,6,7],起始计数位置为元素1 - 第1轮:数到第4个元素为4,移除后剩余数组
[1,2,3,5,6,7],下一轮起始计数位置为元素5 - 第2轮:数到第4个元素为1,移除后剩余数组
[2,3,5,6,7],下一轮起始计数位置为元素2 - 第3轮:数到第4个元素为6,移除后剩余数组
[2,3,5,7],下一轮起始计数位置为元素7 - 第4轮:数到第4个元素为5,移除后剩余数组
[2,3,7],下一轮起始计数位置为元素7 - 第5轮:数到第4个元素为7,移除后剩余数组
[2,3],下一轮起始计数位置为元素2 - 第6轮:数到第4个元素为3,移除后仅剩元素2
可以看到示例给出的移除序列[4,1,6,5,2,7]在第五步就出现了错误,误将应该移除的7写为2,最终才得到了错误的返回值3。
公式验证
经典约瑟夫环递推公式为f(k) = (f(k-1) + n) % k,其中f(k)为k个元素时最终剩余元素的索引(从0开始计数):
- 1个元素时:
f(1) = 0 - 2个元素时:
f(2) = (0 +4) %2 = 0 - 3个元素时:
f(3) = (0 +4) %3 =1 - 4个元素时:
f(4) = (1 +4) %4 =1 - 5个元素时:
f(5) = (1 +4) %5 =0 - 6个元素时:
f(6) = (0 +4) %6 =4 - 7个元素时:
f(7) = (4 +4) %7 =1
初始数组索引1对应的元素为2,和模拟结果一致。
内容的提问来源于stack exchange,提问作者jonathan Laurent
相关产品推荐
相关产品推荐

