背景:
虽然注定是与腾讯没有机会的,但是想想,还是算得上擦身而过,而且,面试官也给我留下了极好的印象,所以一直想着要把那个题目写写。
题目要求:
现在我有一数组,里面保存着可以区分大小的数据。我想做的事情很简单,找到这组数据中出现次数最多的那个数据,把他的值和次数都记录下来。
当我拿到这个题目的时候,我几乎是没有思路的,但是为了能够不让面试空白,于是决定采用最落后的、最暴力的方法来回答。
思路陈述:
第一思路(暂且认为他是思路吧)是动态申请一个二维数组,因为数据的长度是有限的,其实也是可以固定申请一个方阵,对序列中的数据,逐渐的列出来,没出现一个新的数据,就将其放置在矩阵的新一行中,然后知道穷举到数组的最后一个。此时,开始对每一行数据进行统计,查看个数,之后就能够得到出现次数最多的数据以及其出现次数。但是不难看出,该方法执行效率非常低下,而且还具有很高的内存占用率,除非采用二维动态申请,那样的话,程序的编写又十分的繁琐。
面试官后来提示我,可以先对数据进行排序。排序的作用可以使得相同的数据集中到一起,然后再对数据进行统计,就能够十分快速的获得结果。
程序实现:
下面是使用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");
}
一定要多注意在统计那里,及时更新最大出现次数以及对应数值,当出现次数最大的数值为最大的数值极容易出错。