C ++中的消除游戏
假设我们有一个从1到n的排序整数列表。从左到右结束,我们必须删除第一个数字,然后再删除其他所有数字,直到到达列表的末尾。我们将再次重复上一步,但是这次从右到左,从剩余数字中删除最右边的数字和其他所有数字。我们将再次重复这些步骤,从左到右,从右到左,直到剩下一个数字为止。我们必须找到最后一个以长度为n的列表开头的数字。
因此,如果输入类似n=9,则步骤将如下所示-
2,
6
因此答案将是6。
为了解决这个问题,我们将遵循以下步骤-
左:=1,头:=1,步骤:=1,雷姆:=n
而rem>1
如果left为非零或rem为奇数,则head:=head+step
步骤:=步骤*2
左:=左的倒数
雷姆:=雷姆/2
回头
范例(C++)
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: int lastRemaining(int n) { int head = 1; int step = 1; int rem = n; int left = 1; while(rem > 1){ if(left || rem % 2 == 1){ head += step; } step *= 2; left = !left; rem /= 2; } return head; } }; main(){ Solution ob; cout << (ob.lastRemaining(9)); }
输入值
9
输出结果
6