lc390. 消除游戏

消除游戏

思路

逻辑简单,但是直接模拟实现非常容易超时。
实际实现是不需要真的去模拟删除的过程。通过调整步长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;
    }
}
上一篇:关于位图读取函数int Load_Bitmap_File的lseek问题。


下一篇:2020第一届辽宁省赛E.线段树 ——exgcd + 逆元 + 线段树