int lastRemaining(int n){
int a1=1,k=0,step=1,cnt=n;//首项,循环次数,步长,数组长度
while(cnt>1){
if(k%2==0||cnt%2==1){
a1+=step;
k++;
cnt = cnt>>1;
step = step<<1;
}
return a1;
}
满足以下两个条件首项会被抹除且向后移动step位
1.循环次数为偶数
2.循环次数位奇数且总长为奇数
每次循环,数组长度cnt/2,步长step*2
总长为1停止循环