腾讯面试题解析:重复短信问题

有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。

有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。

请用5分钟时间,找出重复出现最多的前10条。

分析:

常规方法是先排序,在遍历一次,找出重复最多的前10条。但是排序的算法复杂度最低为nlgn。

可以设计一个hash_table, hash_map<string, int>,依次读取一千万条短信,加载到hash_table表中,并且统计重复的次数,与此同时维护一张最多10条的短信表。

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

这样遍历一次就能找出最多的前10条,算法复杂度为O(n)。

实现如下:

#include<iostream>
#include<map>
#include<iterator>
#include<stdio.h>
using namespace std;  

#define HASH __gnu_cxx
#include<ext/hash_map>
#define uint32_t unsigned int
#define uint64_t unsigned long int
struct StrHash
{
        uint64_t operator()(const std::string& str) const
        {
           uint32_t b    = 378551;
           uint32_t a    = 63689;
           uint64_t hash = 0;  

           for(size_t i = 0; i < str.size(); i++)
           {
              hash = hash * a + str[i];
              a    = a * b;
           }  

           return hash;
        }
        uint64_t operator()(const std::string& str, uint32_t field) const
        {
           uint32_t b    = 378551;
           uint32_t a    = 63689;
           uint64_t hash = 0;
           for(size_t i = 0; i < str.size(); i++)
           {
              hash = hash * a + str[i];
              a    = a * b;
           }
                hash = (hash<<8)+field;
           return hash;
        }
};
struct NameNum{
        string name;
        int num;
        NameNum():num(0),name(""){}
};
int main()
{
        HASH::hash_map< string, int, StrHash > names;
        HASH::hash_map< string, int, StrHash >::iterator it;
        NameNum namenum[10];
        string l = "";
        while(getline(cin, l))
        {
                it = names.find(l);
                if(it != names.end())
                {
                        names[l] ++;
                }
                else
                {
                        names[l] = 1;
                        names[l] = 1;
                }
        }
        int i = 0;
        int max = 1;
        int min = 1;
        int minpos = 0;
        for(it = names.begin(); it != names.end(); ++ it)
        {
                if(i < 10)
                {
                        namenum[i].name = it->first;
                        namenum[i].num = it->second;
                        if(it->second > max)
                                max = it->second;
                        else if(it->second < min)
                        {
                                min = it->second;
                                minpos = i;
                        }
                }
                else
                {
                        if(it->second > min)
                        {
                                namenum[minpos].name = it->first;
                                namenum[minpos].num = it->second;
                                int k = 1;
                                min = namenum[0].num;
                                minpos = 0;
                                while(k < 10)
                                {
                                        if(namenum[k].num < min)
                                        {
                                                min = namenum[k].num;
                                                minpos = k;
                                        }
                                        k ++;
                                }
                        }
                }
                i++;  

        }
        i = 0;
        cout << "maxlength (string,num): " << endl;
        while( i < 10)
        {
                cout << "(" << namenum[i].name.c_str() << "," << namenum[i].num << ")" << endl;
                i++;
        }
        return 0;
}

使用g++编译如下:

g++ main.cpp -o main

短信文本文件为:msg.txt

运行:./main < msg.txt

输出结果为:

maxlength (string,num):
(点点母婴坊,4)
(农机配件维修,5)
(红胜超市,6)
(龙溪大酒店,8)
(张记饺子馆,3)
(友谊旅店,3)
(明珠通讯,3)
(金源旅馆,3)
(洞庭山天然泉水,2)
(清源超市,3)

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索重复
, include
, it
, 短信
, int64_t
, c++ 大数据 hash_map
, hash
, t it++
, 读取短信
, names
uint64_t
,以便于您获取更多的相关知识。

时间: 2024-09-01 23:46:51

腾讯面试题解析:重复短信问题的相关文章

朗讯科技垃圾短信过滤与拦截解决方案

保护用户权益,降低设施投资,缓解网络堵塞 朗讯科技(中国)有限公司日前隆重推出基于贝尔实验室创新技术的垃圾短信过滤和拦截(ASA)解决方案,旨在帮助国内电信运营商有效面对日益泛滥的垃圾短信带来的困扰,充分保护移动用户权益以及运营商的短信中心和七号信令投资. 朗讯科技(中国)有限公司网络解决方案副总裁葛瑞德先生表示:"朗讯始终致力于通过最先进的技术创新和解决方案,满足运营商不断变化的业务需求,并推动整个市场的健康发展.ASA解决方案的推出再次展示了朗讯对成为电信运营商可靠合作伙伴的坚定承诺.&qu

腾讯手机管家如何保护Android不收垃圾短信

2012年央视315晚会再次曝光了垃圾短信,并揭露了制造垃圾短信的完善产业链.但是很多用户反映,垃圾短信并没有因为315晚会的曝光而减少.当用户购买了房子.汽车以及其他消费过程中填写了手机号码之后,紧接着就会收到垃圾短信的骚扰,信息被贩卖已经司空见惯. 然而想要通过法律手段进行维权,又面临着各种取证的难题.而借助手机安全软件对垃圾短信进行智能拦截,无疑是最简单有效的解决方案.为了让亿万手机用户不再忍受骚扰,腾讯手机管家对本站表示将全面向垃圾短信开战.本篇文章,小编将解读腾讯手机管家3.3是如何保

工信部整顿垃圾短信,腾讯手机管家帮助用户有效拦截

最新消息,工信部发布通知称,启动为期3个月端口类短信群发业务清理整顿专项行动,以有效遏制垃圾短信泛滥态势.根据通知要求,我国将建成各省联动的垃圾短信处罚机制,并启动短信群发的白名单管理制度. 这是继315晚会曝光短信群发业务之后,工信部再次对垃圾短信进行集体整治.据记者亲身经历,目前每天收到的短信大多都是广告类群发信息,多以区号开头.106开头.业内人士表示这些号码多数为运营商为企业开通的信息服务端口,很多都未经用户许可,进行广告群发业务,严重骚扰用户使用手机. 对此,我们也采访了腾讯手机管家工

腾讯手机管家如何保护Symbian免受垃圾短信骚扰的

2012年央视315晚会再次曝光了垃圾短信,并揭露了制造垃圾短信的完善产业链.但是很多用户反映,垃圾短信并没有因为315晚会的曝光而减少.当用户购买了房子.汽车以及其他消费过程中填写了手机号码之后,紧接着就会收到垃圾短信的骚扰,信息被贩卖已经司空见惯. 然而想要通过法律手段进行维权,又面临着各种取证的难题.而借助手机安全软件对垃圾短信进行智能拦截,无疑是最简单有效的解决方案.为了让亿万手机用户不再忍受骚扰,腾讯手机管家对本站表示将全面向垃圾短信开战.本篇文章,小编将以S60V3平台腾讯手机管家3

校讯通或被滥用学生家长收到广告短信

员村某小学的邓老师正在使用校讯通,她对校讯通的便利性赞不绝口. 家长通过短信能便捷的掌握孩子在学校的情况和学习成绩. 校方称不允许老师将短信沟通平台用作商业用途,运营商强调严禁员工向外泄露客户信息 □本版撰文 信息时报记者 邹捷 张建林 罗辑 本版摄影 信息时报记者 巢晓 近年来,不少中小学及幼儿园为了加强学校.家长.学生三方的沟通,采用了一种名为"校讯通"的短信沟通平台.目前在广东省,已经有过万家学校在使用这种平台.通过这个平台,老师能便捷地发送通知.温馨提示,家长则能及时掌握到孩子

Java pdu短信解码全面解析_java

长短信未验证 有兴趣的可以试试 根据python的方法改写的 /** * PDU短信解析 * * * @param pduPayload * @return */ public static String retrieveSMSInfo(byte[] pduPayload) throws UnsupportedEncodingException { int startPos = 3; //#Originator address int mRP_OA_len = pduPayload[startP

通过手机管家等安全软件进行拦截拦截垃圾短信

清明节网友巧用腾讯手机管家拦截垃圾短信 http://www.enet.com.cn/enews/ 2012年04月06日10:15 来源:eNet硅谷动力 [文章摘要]自从央视315晚会曝光了群发垃圾短信骚扰手机用户之后,很多人都开始寻找治理垃圾短信的方法,工信部也要集体清理运营商端口类群发短信业务.而中国电信等运营商以及警方纷纷为手机用户支招,其中最简单的方法就是通过手机管家等安全软件进行拦截. 自从央视315晚会曝光了群发垃圾短信骚扰手机用户之后,很多人都开始寻找治理垃圾短信的方法,工信部

通过手机管家等安全软件拦截垃圾短信

自从央视315晚会曝光了群发垃圾短信骚扰手机用户之后,很多人都开始寻找治理垃圾短信的方法,工信部也要集体清理运营商端口类群发短信业务.而中国电信等运营商以及警方纷纷为手机用户支招,其中最简单的方法就是通过手机管家等安全软件进行拦截. 网友"茹影随行"就发微博表示,因为手机安装了腾讯手机管家,所以清明节假期玩的很爽,没有被垃圾短信骚扰. 据记者了解,腾讯手机管家除了具备病毒查杀.流量监控.隐私保护等功能外,垃圾短信.骚扰电话的拦截功能做的很不错,有数据显示其垃圾短信拦截率高达98%,是目

央视315晚会再次曝光iPhone垃圾短信

2012年央视315晚会再次曝光了垃圾短信,并揭露了制造垃圾短信的完善产业链.但是很多用户反映,垃圾短信并没有因为315晚会的曝光而减少.当用户购买了房子.汽车以及其他消费过程中填写了手机号码之后,紧接着就会收到垃圾短信的骚扰,信息被贩卖已经司空见惯. 然而想要通过法律手段进行维权,又面临着各种取证的难题.而借助手机安全软件对垃圾短信进行智能拦截,无疑是最简单有效的解决方案.为了让亿万手机用户不再忍受骚扰,腾讯手机管家对本站表示将全面向垃圾短信开战.本篇文章,小编将解读腾讯手机管家(越狱版)是如