枚举思路:
假设有n个人,一共传time次,最后返回的数为t
令t=t+a
a={1,-1}
很明显,每经过n-1次循环,a的正负发生一次变化
令d=(time/(n-1))+1,得到a正负发生变化的次数<因为当time<(n-1)时,time/(n-1)=0,没有进行计数,所以要加1>
这样d就是a正负发生变化的次数
根据题意,很明显
当d为奇数时,a为正;当d为偶数时,a为负
所以现在问题转变为判断d的奇偶
我们知道:判断奇偶是看这个数是否是2的倍数
所以通过判断d%2是否为0来判断d的奇偶
若为0:d是偶数,a为负 ——> t=t-1
若为1:d是奇数,a为正 ——> t=t+1
暴力枚举:
#include <iostream>
using namespace std;
int main()
{
int t=1;
int n=4;
int time=5;
for(int i=0;i<time;i++){ //i从0开始,是为了保持每一轮中(i/(n-1))的一致;若i从1开始,每一轮中(i/(n-1))的值就不一致了,无法进行判断
int falg=1;
if(((i/(n-1)+1)%2)==0){
falg=-1;
}
t=t+falg;}
cout<<t<<endl;
return 0;
}
算法优化思路:
根据上面的分析可知,每经过2(n-1)次,a变为正
将2(n-1)次循环看做一轮
令d=time%[2*(n-1)],根据d的数值就可以判断出t的值
若d<n-1: t=d+1<因为d其实是间隔数,所以需要加上1,才是要返回的数据>
若d>=n-1: d-(n-1)是逆序部分的间隔数,逆序部分一共有n-1个间隔,去掉d-(n-1),就是还剩下的间隔数,同理,因为[(n-1)-d-(n-1)]是间隔数,所以要加1才是t的值,所以 ——>t=(n-1)-d-(n-1)+1=2n-d-1;
算法优化:
class Solution {
public:
int passThePillow(int n, int time) {
time %= (n - 1) * 2;
return time < n ? time + 1 : n * 2 - time - 1; }
};