算法每日一题——第七天——消除游戏

编程入门 行业动态 更新时间:2024-10-06 18:28:42

<a href=https://www.elefans.com/category/jswz/34/1770096.html style=算法每日一题——第七天——消除游戏"/>

算法每日一题——第七天——消除游戏

原题链接:力扣 

分析:

输入一个n,我们就要对1到n的所有数就行消除。我在看见这道题最开始的想法是将1到n的所有数装到一个数组里面,被消除的数标记为-1,再进行下一次消除时遇见-1就跳过,但是这样写会非常麻烦。

我们先观察上面的样例:

第一次:1,2,3,4,5,6,7,8,9

第二次:2,4,6,8

第三次:2,6

第四次:6

可以发现每次的结果都是一个等差数列,第一次公差为1,第二次公差为2,第三次公差为4。公差的变化规律很容易发现(每次扩大两倍)。那我们就可以思考,是否可以用数列首项,尾项,公差来表示一组数呢?(后面用a1,an,d来分别表示首项,尾项和公差)

如果我们能找出首项和尾项的变化规律,那么我们就可以用他们来表示一组数了。

不难发现以下规律:

从左开始删:有偶数个整数时,a1 = a1 + d ; an = an(不变)

                      有奇数个整数时,a1 = a1 + d ; an = an - d

从右开始删:有偶数个整数时,a1 = a1(不变) ; an = an - d

                      有奇数个整数时,a1 = a1 + d ; an = an - d

找到以上规律,这道题就非常容易了。

接口代码:

int lastRemaining(int n)
{int a1 = 1;int an = n;int d = 1;while(1){if(n == 1)return a1;if(n % 2 == 0)a1 += d;else{a1 += d;an -= d;}d *= 2;n /= 2;if(n == 1)return a1;if(n % 2 == 0)an -= d;else{a1 += d;an -= d;}d *= 2;n /= 2;}   
}

更多推荐

算法每日一题——第七天——消除游戏

本文发布于:2024-02-28 10:56:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1769430.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:算法   第七天   游戏

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!