建立與原數組相同的標記數組,每次刪除一個元素後做一標記,最後將沒有標記的元素輸出。
/**
*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];
}