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

背景:

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

题目要求:

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

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

思路陈述:

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

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

程序实现:

下面是使用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");
}

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

运行结果:

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值