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

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

示例 1:

输入:n = 9
输出:6
解释:
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
arr = [2, 4, 6, 8]
arr = [2, 6]
arr = [6]

示例 2:

输入:n = 1
输出:1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/elimination-game

首先列出几组找出规律

从左向右删除时

1          => 1
1 2       => 1 2
1 2 3       => 1 2 3
1 2 3 4    => 1 2 3 4
1 2 3 4 5    => 1 2 3 4 5
1 2 3 4 5 6 => 1 2 3 4 5 6

从右向左删除时

1          => 1
1 2       => 1 2
1 2 3       => 1 2 3
1 2 3 4    => 1 2 3 4
1 2 3 4 5    => 1 2 3 4 5
1 2 3 4 5 6 => 1 2 3 4 5 6

不难发现几条规律

设从左向右删除的数列为f(n),从右向左删除的数列为b(n)
当n为奇数时n = 2k+1,当n为偶数时n = 2k

f(2k + 1) = f(2k)
f(2k) = 2b(k)
b(2k + 1) = 2f(k)
b(2k) + 1 = 2f(k)

所以任何f(n)都可以转化至f(1)或b(1),只需要记录下每一步转化的运算,最后计算出结果便可。

public int lastRemaining(int n) {boolean flag = true;int ans = 1;List<Integer> s = new ArrayList<>();while (n > 1) {if (flag) {s.add(2);n = n >> 1;} else {if (n % 2 != 0) {s.add(2);n = n >> 1;} else {s.add(1);n = n >> 1;}}flag = !flag;}for (int i = s.size() - 1; i >= 0; i--) {if (s.get(i) == 2) {ans = ans << 1;} else {ans = ans << 1;ans = ans - 1;}}return ans;}

leetcode算法题-390.消除游戏相关推荐

  1. [LeetCode]390.消除游戏

    [LeetCode]390.消除游戏 题目 示例 方法 模拟 题目 列表 arr 由在范围 [1, n] 中的所有整数组成,并按严格递增排序.请你对 arr 应用下述算法: 从左到右,删除第一个数字, ...

  2. LeetCode:390. 消除游戏————中等

    题目 390. 消除游戏 列表 arr 由在范围 [1, n] 中的所有整数组成,并按严格递增排序.请你对 arr 应用下述算法: 从左到右,删除第一个数字,然后每隔一个数字删除一个,直到到达列表末尾 ...

  3. LeetCode 390. 消除游戏

    ​​​​​​390. 消除游戏 给定一个从1 到 n 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右到左,从倒数第一个数字开始 ...

  4. Java实现 LeetCode 390 消除游戏

    390. 消除游戏 给定一个从1 到 n 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右到左,从倒数第一个数字开始,每隔一个数 ...

  5. LeetCode算法题整理(200题左右)

    目录 前言 一.树(17) 1.1.后序遍历 1.2.层次遍历 1.3.中序 1.4.前序 二.回溯(20) 2.1.普通回溯 2.2.线性回溯:组合.排列.子集.分割 2.3.矩阵回溯 三.二分查找 ...

  6. 390. 消除游戏(约瑟夫环)

    390. 消除游戏 列表 arr 由在范围 [1, n]中的所有整数组成,并按严格递增排序.请你对 arr 应用下述算法: 从左到右,删除第一个数字,然后每隔一个数字删除一个,直到到达列表末尾. 重复 ...

  7. LeetCode算法题-Nth Digit(Java实现)

    这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...

  8. LeetCode算法题-Reverse Linked List(Java实现)

    这是悦乐书的第192次更新,第195篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第51题(顺位题号是206).反转单链表.例如: 输入:1-> 2-> 3- ...

  9. LeetCode算法题-Convert a Number to Hexadecimal(Java实现)

    这是悦乐书的第219次更新,第231篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第86题(顺位题号是405).给定一个整数,写一个算法将其转换为十六进制.对于负整数,使 ...

最新文章

  1. hotmail_在新的Hotmail Wave 4中禁用Messenger
  2. 7.30 KubeCon2020 | 今天下午5:40 近几年最火爆的技术峰会之分享主题.NET开发者与Kuberentes...
  3. arraylist内存溢出_ArrayList使用内存映射文件
  4. 计算机二级考试操作题outlook,2017年计算机考试二级考试操作题.doc
  5. zabbix如何监控linux磁盘性能IO
  6. 4代hiv检测50元_50元的乙肝两对半体检,值得吗?检测前,5种行为不要做
  7. myeclipse 配置 SVN
  8. asp网站本地测试服务器,小旋风asp服务器,asp本地环境调试必备
  9. 搜狗站群之搜狗验证推送工具
  10. 自下而上合并排序算法
  11. Unity做360度全景预览
  12. 信号强度从百分比到分贝的转换
  13. 用Python判断手机号码的运营商
  14. Java——七种垃圾收集器+JDK11最新ZGC
  15. 心田花开小学一年级阅读试题
  16. ISE14.7 Spartan3e 呼吸灯
  17. 大数据入门学习必备指南
  18. 日本央行岸道信:欧洲央行、日本央行合作项目Stellar已完成第三阶段的同步跨境支付研究...
  19. ZOJ Monthly, August 2012 题解
  20. OkHttp的简单使用

热门文章

  1. Poison社RPG,百花缭乱的补充资料
  2. MarkDown语法学习教程,2分钟学会速写个人GitHub,轻量化,快捷,迅速,方便.
  3. Word 查找替换,通配符一览表
  4. Python实战|用可视化方式看新闻,迅速了解最新时事热点
  5. 优秀原型设计欣赏:社交类App原型制作分享-LinkedIn
  6. 3D建模教程:3DMAX插件示例!
  7. /etc/postfix下 main.cf 配置文件详解
  8. 免费空间提供永久免费个人网站空间申请
  9. python 输出10个不重复的英文字母--简单,详细注释版
  10. 身边条码事之意大利逛店