数组还原问题

Posted on 2018-09-01 12:13  沙_shine  阅读(749)  评论(0编辑  收藏  举报

问题描述:

给一个array比如[4,2,1,3,5],根据这个array现在我们能有了一个新的array => 每个数是在原array里, 在它左边的所有比它大的number的个数,就是[0,1,2,1,0]. 题目是现在给了这个[0,1,2,1,0]要求原array, 原来array的range是1~n,

 

思路描述:

首先,初始化一个动态数组vector,使其值为:1-n

然后,从给定数组的最后一个开始,依次确定每一个位置上的数字,并将其值从动态数组中删除.

举例:

初始化数组:orderNumber{1,2,3,4,5};给定数组:data{0,1,2,1,0};求原数组res,res初始化为res{0,0,0,0,0}。

1. data[5-1]=0,说明前面没有比其大的数字,则res[5-1]=5.擦除掉orderNumber中已经确定的数字,此时orderNumber数组为orderNumber={1,2,3,4}

2. data[5-2]=1,说明前面有1个比其大的数字,则在剩余数字orderNumber中,有1个比其大的数字为3,则res[5-2]=3,此时,orderNumber={1,2,4}

3. data[5-3]=2,说明前面有2个比其大的数字,则在剩余数字orderNumber中,有2个比其大的数字为1,则res[5-2]=1,此时,orderNumber={1,2,4}

...

依次,可以得到每一个位置上的数字:res = {4,2,1,3,5}

 

代码:

#define ArrarRightGreater
#ifdef ArrarRightGreater


#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
    
    vector<int> data;
    char tempc;
    while ((tempc = cin.get()) != '\n')
    {
        if (tempc != ' ')
        {
            data.push_back(tempc - '0');
        }
    }
    

    //6 2 7 5 8 11 13 1 4 10 3 12 9
    //vector<int> data{0,1,0,2,0,0,0,7,6,2,8,1,4};
    int nsize = data.size();
    vector<int> orderNumber(nsize, 0);
    for (int i = 0; i < nsize; ++i)
    {
        orderNumber[i] = i+1;
    }
    
    vector<int> res(nsize, 0);
    for (int i = nsize - 1; i >= 0; --i)
    {
        res[i] = orderNumber[orderNumber.size() - 1 - data[i]];
        orderNumber.erase(orderNumber.end() - 1 - data[i]);
    }

    for (int i = 0; i < nsize; ++i)
    {
        cout << res[i]<<"  ";
    }
    cout << endl;

    system("pause");
    return 0;
}




#endif/*ArrarRightGreater*/

测试: