我正在尝试解决与此类似的问题:Throwing cards away。我的问题唯一的变化是我不需要丢弃卡片的顺序。我只想要剩下的最后一张卡。
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int main(void)
{
int n, i;
while ((scanf ("%d", &n) == 1) && n != 0)
{
vector<int> cards;
for (i = 1; i <= n; ++i)
{
cards.push_back(i);
}
while (cards.size() != 1)
{
cards.erase(cards.begin());
cards.push_back(cards.front());
}
printf ("%d\n", cards.at(1));
}
return 0;
}
这是我第一次使用vector
和所有相关的STL函数。我检查了this,它说erase
函数删除了一个向量元素。因此,while
循环应该继续减小vector
的大小,直到变为1
。但是我没有得到运行它的输出。我认为这是因为无限循环,所以我尝试在每次迭代中打印vector
的大小,并看到大小只减少一次。所以这导致无限循环。但是我不明白为什么它没有进一步减少。
答案 0 :(得分:2)
您的矢量大小永远不会降至1,因为您不移动前卡,而是将其复制到矢量的末尾。 cards.push_back(cards.front())
将尺寸增加一个。如果您的目标是将前卡移动到矢量背面,则交换两条线:
while (cards.size() != 1)
{
cards.push_back(cards.front());
cards.erase(cards.begin());
}
这不会减小当然的规模。
编辑:这是建议的解决方案,删除前卡,移动下一张卡到卡座底部(矢量)。
while (cards.size() != 1)
{
cards.erase(cards.begin());
cards.push_back(cards.front());
cards.erase(cards.begin());
}
每次迭代时,大小将有效减少1。
答案 1 :(得分:2)
while (cards.size() != 1)
{
cards.erase(cards.begin()); // cards.size() goes down
cards.push_back(cards.front()); // cards.size() goes up
}
答案 2 :(得分:0)
如果您只需要将最后一个元素保留在向量中,那么您可以编写
if ( !cards.empty() ) cards.erase( cards.begin(), std::prev( cards.end() ) );