华为2016研发工程师编程题(1)----删数

转载请注明出处<http://blog.csdn.net/qianqin_2014/article/details/51305537>


问题:

有一个数组a[N]顺序存放0-N,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。

以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。

输入描述:

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

输出描述:

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

输入例子:
8

输出例子:

6

方法一:

#include<iostream>
#include<vector>

using std::vector;
using std::cout;
using std::cin;
using std::endl;

int main()
{
	vector<int> vec;
	int num;
	while (cin >> num)
	{
		//载入数据
		for (int i = 0; i < num; i++)
			vec.push_back(i);

		int i = 0;
		auto it = vec.begin();
		//循环依次删除满足条件的数据,直至容器中还剩下最后一个元素
		while (vec.size() != 1)
		{
			if ((i + 1) % 3 == 0)
				it = vec.erase(it);//返回被删除元素的下一个元素的迭代器
			if ((i + 1) % 3 != 0)
				it++;
			i++;

			if (it == vec.end())//关键所在
				it = vec.begin();
		}

		/*for (auto c : vec)
			cout << c << endl;*/
		cout << vec[0] << endl;
		vector<int>().swap(vec);		//别忘了清空容器
	}
	return 0;
}
注意:这种方法存储元素肯定不能用数组,因为数组是固定大小的,无法删除其中的元素来改变大小。

方法二:

待续...



转载请注明出处<http://blog.csdn.net/qianqin_2014/article/details/51305537>

你可能感兴趣的:(华为2016研发工程师编程题(1)----删数)