2016/12/30其实一直想写的一道腾讯面试题

来源:互联网 发布:广东广电网络营业厅 编辑:程序博客网 时间:2024/05/18 01:57

背景:

虽然注定是与腾讯没有机会的,但是想想,还是算得上擦身而过,而且,面试官也给我留下了极好的印象,所以一直想着要把那个题目写写。

题目要求:

现在我有一数组,里面保存着可以区分大小的数据。我想做的事情很简单,找到这组数据中出现次数最多的那个数据,把他的值和次数都记录下来。

当我拿到这个题目的时候,我几乎是没有思路的,但是为了能够不让面试空白,于是决定采用最落后的、最暴力的方法来回答。

思路陈述:

第一思路(暂且认为他是思路吧)是动态申请一个二维数组,因为数据的长度是有限的,其实也是可以固定申请一个方阵,对序列中的数据,逐渐的列出来,没出现一个新的数据,就将其放置在矩阵的新一行中,然后知道穷举到数组的最后一个。此时,开始对每一行数据进行统计,查看个数,之后就能够得到出现次数最多的数据以及其出现次数。但是不难看出,该方法执行效率非常低下,而且还具有很高的内存占用率,除非采用二维动态申请,那样的话,程序的编写又十分的繁琐。

面试官后来提示我,可以先对数据进行排序。排序的作用可以使得相同的数据集中到一起,然后再对数据进行统计,就能够十分快速的获得结果。

程序实现:

下面是使用C++中的vector编写的实现,仅供参考,排序部分采用的是基本的冒泡排序,如有不足请大家多多指教。

#include<iostream>#include<vector>using namespace std;void main(void){    vector<int> a;    int len = a.size();    int tmp;    while(len == 0)    {        cout<<"数组中有 "<<len<<" 个数据!"<<endl<<"请输入正整数,以负数表示输入结束,输入0结束改程序!"<<endl;        cin>>tmp;        while(tmp > 0)        {            a.push_back(tmp);            cin>>tmp;        }        if(tmp == 0)        {            cout<<""<<endl;            system("pause");            return;        }        len = a.size();    }    cout<<"输入了 "<<len<<" 个数据!"<<endl;    /////////// 排 序    cout<<"开 始 排 序 . . . . . . "<<endl;    for(int ii = 0;ii < len ;ii = ii + 1)    {        for(int jj = len - 1;jj > ii ;jj = jj - 1)        {            if(a.at(ii) > a.at(jj))            {                tmp = a.at(ii);                a.at(ii) = a.at(jj);                a.at(jj) = tmp;            }        }    }    cout<<"排序完毕,结果如下:"<<endl;    for(int ii = 0;ii < len ;ii = ii + 1)    {        cout<<a.at(ii)<<"\t";    }    cout<<endl;    cout<<"开 始 统 计 . . . . . . "<<endl;    int cnt = 1;    int cnt_max = cnt;    int max_num_val = a.at(0);    for(int ii = 1;ii < len - 1 ;ii = ii + 1)    {        if(a.at(ii) == a.at(ii - 1))        {            cnt = cnt + 1;            if(cnt > cnt_max)            {                cnt_max = cnt;                max_num_val = a.at(ii);            }        }        else        {            cnt = 1;        }    }    cout<<"出现次数最多的数是: "<<max_num_val<<" ,出现次数为: "<<cnt_max<<endl;    system("pause");}

一定要多注意在统计那里,及时更新最大出现次数以及对应数值,当出现次数最大的数值为最大的数值极容易出错。

运行结果:

这里写图片描述

0 0
原创粉丝点击