消除游戏
思路
逻辑简单,但是直接模拟实现非常容易超时。
实际实现是不需要真的去模拟删除的过程。通过调整步长step
控制来实现删除的。
头尾的数是否要删除就要看头尾的数是否是奇数:
(以从前往后顺序为例)
- 如果是奇数,最后的数就要更新
- 如果是偶数,最后的数不变
实现
class Solution {
public int lastRemaining(int n) {
int flag = 1, k=n, step = 1;
int begin = 1, end = n;
while(k>1){
if(flag == 1){
begin += step;
// end = (k%2 == 0) ? end : end-step;
}
else{
begin = (k%2 == 0) ? begin : begin+step;
// end -= step;
}
step <<= 1;
k >>= 1;
flag ^= 1;
}
return begin;
}
}