题目
这一题乍一看,没啥头绪。
不慌,我们慢慢推导一下。
我们看示例1,里面的1——>2的位置是怎么变化的。
位置3——>位置1
位置4——>位置2
位置5——>位置3
位置1——>位置4
此时K=2
我们可以看到原先位置大于2的值X变成了X-2,即X-K
那么小于2(K)的值变成啥样了呢?
1-2=-1,但是现在是4呀,因为1被移动了一轮,也就是加了当前轮数的个数。
即X-K+N
归纳一下,可以得出
(X-K+N)%N=下一轮的位置
N为当前轮有几个数。
将示例1中的一开始N=5代入。
(X1-K+5)%5=X2
(X2-K+4)%4=X3
(X3-K+3)%3=X4
(X4-K+2)%2=1
将示例1中的K=2代入
(X1-2+5)%5=X2
(X2-2+4)%4=X3
(X3-2+3)%3=X4
(X4-2+2)%2=1
求X1是几?
当然是从最后一行倒推上去啊。
X4=((1+2)+K)%2=(1+2+2)%2=1
(X3-2+3)%3=1
X3=(X4+3+K)%3=(1+3+2)%3=0
0,怎么会是0呢,下标都是从1开始的,0其实就是3
X3=(X4+3+K)%3=(1+3+2)%3=3
X2=(X3+4+K)%4=(3+4+2)%4=1
X1=(X2+5+K)%5=(1+5+2)%5=3
所以,我们就可以写出代码来了。
class Solution {
public int findTheWinner(int n, int k) {
int cur=1;
for(int i=2;i<=n;i++){
cur=(cur+i+k)%i;
if(cur==0){
cur=i;
}
}
return cur;
}
}
写在最后,很多算法题不是一打眼就知道是什么规律的,需要大家耐心去推导。当然你不推导,直接用队列进行模拟也行,但是这样消耗就比较大。数据量大的话,可能就超时。
不要慌,耐心。