题目:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)。
可以采用一个链表来模拟数字环。代码如下:
class Solution {
public:
int LastRemaining_Solution(unsigned int n, unsigned int m)
{
if(n<1||m<1)
return -1;
list<int> li;
int i;
for(i=0;i<n;i++)
{
li.push_back(i);
}
list<int>::iterator iter=li.begin();
while(li.size()>1)
{
for(i=1;i<m;i++)
{
iter++;
if(iter==li.end())
iter=li.begin();
}
list<int>::iterator next=++iter;
if(next==li.end())
next=li.begin();
--iter;
li.erase(iter);
iter=next;
}
return *iter;
}
};
当然,如果面试官不让你用STL,那你自己实现一个链表也可以,不是很难。
class Solution {
public:
int LastRemaining_Solution(unsigned int n, unsigned int m)
{
if(m<1||n<1)
return -1;
if (m == 1)
return n - 1;
int i = 1;
ListNode *head = new ListNode(0);
ListNode *cur = head;
while (i<n)
{
ListNode *temp = new ListNode(i);
cur->next = temp;
cur = cur->next;
i++;
}
cur->next = head;
while (head != head->next->next)
{
cur = delNode(head, m);
head = cur;
}
if (m % 2 == 0)
return head->val;
else
return head->next->val;
}
ListNode* delNode(ListNode *head, unsigned int m)
{
int i;
ListNode *cur = head;
for (i = 1; i<m-1; i++)
{
cur = cur->next;
}
ListNode *temp = cur->next;
cur->next = cur->next->next;
delete temp;
return cur->next;
}
};
struct ListNode
{
int val;
ListNode *next;
ListNode(int x):val(x){}
};