循环删除固定顺序的值,剩下的最后一个值一开始为几

题目
题目描述
示例
这一题乍一看,没啥头绪。
不慌,我们慢慢推导一下。
我们看示例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;
    }
}

写在最后,很多算法题不是一打眼就知道是什么规律的,需要大家耐心去推导。当然你不推导,直接用队列进行模拟也行,但是这样消耗就比较大。数据量大的话,可能就超时。

不要慌,耐心。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rgbhi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值