文章目录
题目1,求最后一个人的编号
N个人围城一圈, 第一个人编号为0, 从0开始,数到K的人枪毙,问最终留下来的人的编号
思路分析
本题用递归的方法, 设f[n][k]
含义为总共n个人,数到第k个人枪毙,最终留下的人的编号.
首先执行第一步,从0开始数,枪毙的一定是编号为k-1
的人,那么对于接下来n-1
个人如何处理?
调用f[n-1][k]
,返回的是共n-1
人时,最终留下的人的编号(注意这个编号从0开始),但是f[n-1][k]
是从0
开始的,所以需要处理一下映射的问题, (f[n-1][k] + k ) %n
,就是相当于将圈旋转了一下,将0映射成了K,这里为什么+k,而不是+k-1,因为f[n-1][k]
返回的是一个编号而不是第几个人,这里加上的偏移量应该是人头数,不应该是编号数。
递归出口是当 n == 1
应该返回0
,编号为0的人
当初思考的时候的一些疑问:对于那些已经被枪毙的人再次编号的时候是如何跳过的?
这个问题需要直接看结果
,对于一个递归结果,他返回的就是n个人,每次击杀第k个人的最终人的编号,借助你从n-1
层拿来的结果,上一层的结果已经为你考虑好了枪毙的是第几个人
,这时你只需要退回去,加上一个人,从n-1
个人变成n
个人,并且死的是第k个人,将 k ~ n-1 ~0 ~ k-2
连成环,算出这个新环里死的是第几个人就行了
代码如下(示例):
int f(int n ,