从一堆(大量的)无序不重复数组成的数组中寻找一指定数出现的位置

题目要求:

从一堆给定的大量的无序不重复数中寻找某一指定数在数组中出现的位置;

思考方向:

通过空间换时间的方法,将每个数组中的元素放入一个map容器中,将数组中的值作为key,下标作为value即可;

代码:

#include
#include
#include
#include
#include

using namespace std;

template<int SIZE = 10000>
void generateArray(vector<int>& vec)
{
    srand( (unsigned int)time(NULL) );
    bool isExit[SIZE] = {false};
    for (int i = 0; i < SIZE; ++i)
    {
        int num = rand() % SIZE;
        if (!isExit[num])
        {
            isExit[num] = true;
            vec.push_back(num);
        }
        else
        {
            --i; // 重复的不计算为已经得到的元素个数
        }       
    }
}

void doMap(map<int, int>& m, vector<int>& vec)
{
    vector<int>::iterator begin = vec.begin();
    vector<int>::iterator end = vec.end();
    for (int pos = 0; begin != end; begin++, pos++)
    {
        m[vec[pos]] = pos;
    }
}

int main(int argc, char *argv[])
{
    vector<int> vec;
    map<int, int> m;
    generateArray<10000>(vec);
    cout << vec.size() << endl;
    doMap(m, vec);
    int pos = m[9000];
    cout << "9000在数组中的位置是: " << pos << endl;
    cout << "vec[" << pos << "]=" << vec[pos] << endl;
    return 0;

}

运行效果:

从一堆(大量的)无序不重复数组成的数组中寻找一指定数出现的位置_第1张图片

对产生随机数的一点思考:

以上代码中的产生随机数问题,当要产生一个比较大容量的vector对象时,用以上的方法产生随机数会有一个比较明显的数据接受率的问题,可能导致产生的数据经常丢弃,从而生成数组很慢,这是想到的方法是生成对应的数组,然后通过洗牌算法进行乱序达到产生随机数组的目的;

代码:

// 洗牌算法用于数组乱序示例
#include
#include
#include
using namespace std;

/*
经典的洗牌算法Fisher–Yates shuffle伪代码:
for i from 0 to n − 1 do
    j ← random integer with i ≤ j < n
        exchange a[j] and a[i]
*/


void shuffle(int a[], int  n)
{
    // 设置rand()产生随机数时的随机数种子
    srand((unsigned int)time(NULL));
    if (a == NULL || n < 1)
    {
        return;
    }
    for (int current = 0; current < n; current++)
    {
        // 注意这里的 (n-current),否则会导致数组越界访问修改的错误
        int randPos = rand() % (n-current) + current;
        int tmp = a[current];
        a[current] = a[randPos];
        a[randPos] = tmp;
    }
}

void printArray(int a[], int n)
{
    if (a != NULL && n > 0)
    {
        for (int index = 0; index < n; index++)
        {
            cout << a[index] << "\t";
            // 每打印8个换行,+1是因为0的时候回第一行打印多一个,所以进行+1处理
            if ( (index+1) % 8 == 0) 
                cout << endl;
        }
        cout << endl;
    }
}

void initArray(int a[], int n)
{
    if (a != NULL && n > 0)
    {
        for (int index = 0; index < n; index++)
        {
            a[index] = index;
        }
    }
}

int main()
{
    /*
    1: srand()用来设置rand()产生随机数时的随机数种子。在调用rand()函数产生随机数前,必须先利用srand()设好随机数种子(seed),
     如果未设随机数种子, rand()在调用时会自动设随机数种子为1;
    2: 如果没有通过srand进行设置随机数种子,那么每次随机数种子都自动设成值1 ,进而导致rand()所产生的随机数值都一样
    3:函数原型:void srand (unsigned int seed);
    */
    //srand((unsigned int)time(NULL)); 
    //for (int k = 1; k <= 10; k++)
    //  printf("%i ", rand());

    int array[100000];
    initArray(array, 100000);
    //printArray(array, 100000);
    shuffle(array, 100000);

    printArray(array, 100);
    return 0;
}

你可能感兴趣的:(面试杂谈)