大佬,牛!!!
伪代码
记录第一个等差数列的a1,也就是1
记录向左还是向右遍历,因为在向右的时候,会有特殊情况的。第一次是向右
记录间隔step,第一次的时候间隔是1
记录元素个数,cnt,第一次的时候一定是n
while循环,只要cnt不是1。一次while就是一行的删除
如果是向右的话,下一个a1一定是现在的a1+间隔step
如果是向左的话,需要判断,现在还有多少个元素,如果是偶数个则还是a1,否则就变成了a1+step。因为偶数的时候,上一个的a1是不被删除的。
方向反转
cnt要/2
step要*2
return a1即可
java代码
class Solution {
public int lastRemaining(int n) {
int a1 = 1;// 每个等差数列的第一个元素
boolean isToRigth = true;// 是不是向右
int cnt = n;// 元素个数
int step = 1;// 下一个等差数列的a1和本次等差数列a1的位置之间的距离,每次这个step都需要*2
while (cnt > 1) {// 一个while就是一行的遍历
if (isToRigth) {// 向右,则下一个等差数列的a1是a1+step
a1 = a1 + step;
} else {
// 向左,则下一等差数列的a1还是a1+step,
// 但是这时候有个特殊情况,就是如果当前是偶数的话,a1还是a1,因为删除的节点是a1+step,而a1不删除
a1 = (cnt % 2 == 0) ? a1 : a1 + step;
}
isToRigth = !isToRigth;
cnt /= 2;
step *= 2;
}
return a1;
}
}