栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode - 390 -消除游戏 - Java - 细喔

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode - 390 -消除游戏 - Java - 细喔

文章目录
  • 题目
  • 题目解析
  • 解题思维
  • 代码实现过程(因为细节需要)
  • 最后附上代码
    • 代码细节

题目


题目解析

n 表示当前有n个数字(1 ~ n),然后就是开始删除数字。
先 正向删除:删除一个数据,下一个不删,以此规律,来对这组数据进行删除。
然后 反向删除 :也是一样,删除一个数据,下一个不删。只不过是反着来的。
正反向删除,交替删除。
直到 这组数据,剩余 1 个数据。将其返回。( 如果 n 一开始 就是 1,就直接返回 1)


解题思维


代码实现过程(因为细节需要)


最后附上代码
class Solution {
    public int lastRemaining(int n) {
        int firstNum = 1;// 删除后,数组的第一个元素
        int k =0;// 删除次数,k == 0表示这组数据没有被删除任何元素
        int tolerance = 1;// 记录公差,无论正向还是反向删除,每删除一次,公差变为自身的两倍
        int curNum = n;//记录数字个数
        while(curNum > 1){
            if(k % 2 == 0){//以偶数为 正向删除标准,奇数为反向删除标志.而且第一次删除是正向删除。
                firstNum += tolerance;
            }else{// 奇数 为反向删除,需要判断奇偶性
                firstNum = (curNum % 2 ==0) ? firstNum : firstNum + tolerance;
            }
            k++;
            tolerance = tolerance << 1;
            curNum = curNum >> 1;
        }
        return firstNum;
    }
}
代码细节

公差 和 数据个数 利用 二进制移位,进行 2倍扩大 和 缩小。

这个比较基础,我就粗略的讲一下,因为 java 的底层部分,涉及不多。毕竟是站在巨人的肩膀。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/690756.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号