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停止循环
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)