題目:
給定乙個從1 到 n 排序的整數列表。
首先,從左到右,從第乙個數字開始,每隔乙個數字進行刪除,直到列表的末尾。
第二步,在剩下的數字中,從右到左,從倒數第乙個數字開始,每隔乙個數字進行刪除,直到列表開頭。
我們不斷重複這兩步,從左到右和從右到左交替進行,直到只剩下乙個數字。
返回長度為 n 的列表中,最後剩下的數字。
示例:輸入:
n = 9,
1 2 3 4 5 6 7 8 9
2 4 6 8
2 66
輸出:6
思路:每刪一次,數字之間的距離會變為之前的兩倍,並且:
從左往右刪的時候,每次都是刪掉第乙個數字;
從右往左刪的時候,則有可能刪掉第乙個或者第二個數字;
如果剩下的數字個數是偶數,刪掉的是第二個數字;
如果剩下的數字個數是奇數,刪掉的是第乙個數字;
所以我們只需要計算出並記錄當前陣列的第乙個數字,只要第乙個數字有了,後面的數字都可以計算出來了。
**
class
solution
:def
lastremaining
(self, n:
int)
->
int:
base=
1 res=
1while
(base*
2<=n)
: res+=base
base*=2if
(base*
2>n)
:breakif(
int(
(n/base))%
2==1)
: res+=base
base*=
2return res
LeetCode 390 消除遊戲
給定乙個從1 到 n 排序的整數列表。首先,從左到右,從第乙個數字開始,每隔乙個數字進行刪除,直到列表的末尾。第二步,在剩下的數字中,從右到左,從倒數第乙個數字開始,每隔乙個數字進行刪除,直到列表開頭。我們不斷重複這兩步,從左到右和從右到左交替進行,直到只剩下乙個數字。返回長度為 n 的列表中,最後...
Leetcode 390 消除遊戲 遞迴
給定乙個從1 到 n 排序的整數列表。首先,從左到右,從第乙個數字開始,每隔乙個數字進行刪除,直到列表的末尾。第二步,在剩下的數字中,從右到左,從倒數第乙個數字開始,每隔乙個數字進行刪除,直到列表開頭。我們不斷重複這兩步,從左到右和從右到左交替進行,直到只剩下乙個數字。返回長度為 n 的列表中,最後...
Leetcode 390 消除遊戲 C
給定乙個從1 到 n 排序的整數列表。首先,從左到右,從第乙個數字開始,每隔乙個數字進行刪除,直到列表的末尾。第二步,在剩下的數字中,從右到左,從倒數第乙個數字開始,每隔乙個數字進行刪除,直到列表開頭。我們不斷重複這兩步,從左到右和從右到左交替進行,直到只剩下乙個數字。返回長度為 n 的列表中,最後...