算法-每天一道题(15)-删数

有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。

输入描述:

每组数据为一行一个整数n(小于等于1000),为数组成员数,如果大于1000,则对a[999]进行计算。

输出描述:

一行输出最后一个被删掉的数的原始下标位置。

输入例子:

8

输出例子:

6

C++

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	int n;
	while (cin >> n)
	{
		if (n > 1000) n = 1000;
		vector<int> v(n);
		for (int i = 0; i<n; i++)
			v[i] = i;
		vector<int>::iterator itor;
		itor = v.begin();
		while (true)
		{
			if ((itor + 1) == v.end())
				itor = v.begin();
			else
				itor++;
			if ((itor + 1) == v.end())
				itor = v.begin();
			else
				itor++;

			if ((itor + 1) == v.end())
			{
				if (v.size() == 1)
				{
					cout << *itor << endl;
					break;
				}
				v.pop_back();
				itor = v.begin();
			}
			else
				itor = v.erase(itor);
		}
	}
	return 0;
}

/*
解题思路:

隔两个数删,其实是相当于自加了3次,
但是erase()方法会向后移动一位,所以只需要加2次。
这里判断是否到向量尾部元素的方法是((itor + 1) == v.end()),
如果是尾部元素则,不进行自加,直接赋值为v.begin()
*/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部