class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算出旺仔哥哥最后会站在哪位小朋友旁边
* @param a int整型vector 第 i 个小朋友的数字是 a_i
* @param m int整型 表示旺仔哥哥的移动次数
* @return int整型
*/
int stopAtWho(vector<int>& a, int m) {
// write code here
//本题实际上是一个类约瑟夫环问题,只是不需要跳过第m个小朋友(详见本题单数组问题,约瑟夫环)
//因此不需要用if来判断该小朋友是否需要跳过,只需一直走即可
//难点于往后绕回,请见下方题解
int n=a.size();//获取数组长度
int cur{};//第cur个小朋友(其实就是一条指针)
while(m--)//循环m次
{
int k=a[cur];//第cur个小朋友身上代表的步数
cur=((cur-k%n)+n)%n;//需要走的步数
/*下面详细解析这个表达式的含义:
首先是cur-k%n,意思是当前步数减去第cur个小朋友身上的步数,显然如果k>n,
那么指针会多转至少一圈才会回到原点,我们不好处理这个转圈的过程,于是让k对n取模。
接着是加了一个n,这里可以让负数变成整数,如果k的值比指针cur的值大,加上一个n就能让指针
回到它该有的值(可以自己拿实例走一遍试试)。
最后是取模n,这一步是为了消除先前加n的影响,如果指针cur减去步数k以后大于0,那么本来就不需要加n,加上这个n以后就会溢出,显然不是我们想要的结果。*/
}
return cur+1;//返回1-based
}
};