劍指offer 62:圓圈中最後剩下的數字

建立與原數組相同的標記數組,每次刪除一個元素後做一標記,最後將沒有標記的元素輸出。

/**
 *Copyright @ 2019 Zhang Peng. All Right Reserved.
 *Filename:
 *Author: Zhang Peng
 *Date:
 *Version:
 *Description:
**/

#include<iostream>
#include<vector>

using namespace std;
int leftNum(vector<int> data, int index,int step)
{
	int result = 0;
	int len = data.size();
	if (len == 0)
		return result;
	vector<int > label(len, 1);
	int start = index;

	//按照規則刪除圓圈中的數字
	for (int i = 0; i < len-1; i++)
	{
		int temp = step;
		int deindex = start;
		while (temp > 0)
		{
			if (label[deindex] == 1)
			{
				temp--;		
				if (temp == 0)
					break;
			}				
			deindex++;
			if (deindex == len)
				deindex = 0;
		}
		label[deindex] = 0;
		while (label[deindex] == 0)
		{
			deindex = (deindex + 1) % len;
		}
		start = deindex;
	}

	//找出剩下的數字
	for (int i = 0; i < len - 1; i++)
	{
		if (label[i] == 1)
			return data[i];
	}
}

int main()
{
	vector<int > data = { 0, 1, 2, 3, 4};
	cout << leftNum(data, 0, 3) << endl;

    system("pause");
    return 0;
}

將上述代碼進行優化,利用迭代器+erase函數來實現

int leftNum2(vector<int> data, int index, int step)
{
	vector<int > result=vector<int>(data.begin(), data.end());
	vector<int>::iterator it = result.begin();
	advance(it, index);
	for (int i = 0; i < data.size() - 1; i++)
	{
		for (int j = 0; j < step-1; j++)
		{
			it++;
			if (it == result.end())
				it = result.begin();
		}		
		it=result.erase(it);	//返回所刪除迭代器下一位置的迭代器
		if (it == result.end())
			it = result.begin();
	}
	return result[0];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章