390. 消除游戏


列表 arr 由在范围 [1, n] 中的所有整数组成,并按严格递增排序。请你对 arr 应用下述算法:

从左到右,删除第一个数字,然后每隔一个数字删除一个,直到到达列表末尾。
重复上面的步骤,但这次是从右到左。也就是,删除最右侧的数字,然后剩下的数字每隔一个删除一个。
不断重复这两步,从左到右和从右到左交替进行,直到只剩下一个数字。
给你整数 n ,返回 arr 最后剩下的数字。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/elimination-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.util.Scanner;

class Solution {
    public int lastRemaining(int n) {
        int total = n;
        int ans = 1;
        int step = 1;
        boolean direct = true;

        while (total > 1) {
            if (direct) {
                ans = ans + step;
            } else {
                ans = (total % 2 == 0) ? ans : ans + step;
            }
            step <<= 1;
            total >>= 1;
            direct = !direct;
        }
        return ans;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            System.out.println(new Solution().lastRemaining(in.nextInt()));
        }
    }
}

相关