力扣 | 2582递枕头 | 取余?滑动窗口?异曲同工?

92 篇文章 0 订阅
42 篇文章 0 订阅

很好理解的题
有n个人,1到n顺序排成一列
每个人传递枕头耗时1s,在传到两边的时候要反向传递
最开始从下标为1的张三开始传,试问经过t s后,枕头到了哪个人手里?

因为传递要考虑变向,即当传到n 下一个人就是 n-1 (方向由 递增到递减)
当传到1时,下一个人就是 2(方向由递减到递增)
当传完一个轮回,就代表着重新传递
所以,第一反应就是 用取余的,确定第t s 在哪个人手里
取余 可以理解为对中间偏移量进行等长划分,最后一部分可能正好划分完,也可能小于 等长偏移量
那这个偏移量是多少呢?简单分析,方向(向右),到了第n个人必须反向,那么向左的偏移量就是 n- 1(因为最开始就是从1开始的),反向,从n -1开始 到1 向左偏移量是 n -1 两边加起来 等长偏移量就是 2n-1
当取余后的值 x < n 方向为 向右 直接 x + 1 简单理解为只有 x s
当求余后的值 x >=n方向时,为向左 [1 2 …n n+1 2n-1 2n-2]此刻x在后半段,所求的位置差等于 x到2n-1的偏移量 ,也就是x到终点2n-2的距离 为2n-2-x

int  ans(int n, int t){
	int x = t %(2*n-2);
	if(x < n){
		return (x +1);
	}else
		return (2*n-2 -x);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值