7-46 新浪微博热门话题 (30 分)(思路+详解+set + map)pta逐个点过的 来呀兄弟们
一 :題目
新浪微博可以在發(fā)言中嵌入“話題”,即將發(fā)言中的話題文字寫在一對“#”之間,就可以生成話題鏈接,點(diǎn)擊鏈接可以看到有多少人在跟自己討論相同或者相似的話題。新浪微博還會隨時更新熱門話題列表,并將最熱門的話題放在醒目的位置推薦大家關(guān)注。
本題目要求實(shí)現(xiàn)一個簡化的熱門話題推薦功能,從大量英文(因?yàn)橹形姆衷~處理比較麻煩)微博中解析出話題,找出被最多條微博提到的話題。
輸入格式:
輸入說明:輸入首先給出一個正整數(shù)N(≤10
5
),隨后N行,每行給出一條英文微博,其長度不超過140個字符。任何包含在一對最近的#中的內(nèi)容均被認(rèn)為是一個話題,輸入保證#成對出現(xiàn)。
輸出格式:
第一行輸出被最多條微博提到的話題,第二行輸出其被提到的微博條數(shù)。如果這樣的話題不唯一,則輸出按字母序最小的話題,并在第三行輸出And k more …,其中k是另外幾條熱門話題的條數(shù)。輸入保證至少存在一條話題。
注意:兩條話題被認(rèn)為是相同的,如果在去掉所有非英文字母和數(shù)字的符號、并忽略大小寫區(qū)別后,它們是相同的字符串;同時它們有完全相同的分詞。輸出時除首字母大寫外,只保留小寫英文字母和數(shù)字,并用一個空格分隔原文中的單詞。
輸入樣例:
4 This is a #test of topic#. Another #Test of topic.# This is a #Hot# #Hot# topic Another #hot!# #Hot# topic輸出樣例:
Hot 2 And 1 more ...二:思路分析
思路:想辦法將# #中的數(shù)據(jù)提取出來,然后用map容器進(jìn)行存儲m[str] +=1;如果出現(xiàn)相同的話題
那就加一,(沒有重復(fù)的m[str]是默認(rèn)為 0 的也就是最后的m[str] == 1)
接下來map容器當(dāng)中最后一個值就是最大的當(dāng)然可能會出現(xiàn)重復(fù)的但沒關(guān)系,我們再根據(jù)已知
的最大值即可求取,然后相同話題的個數(shù)也就是 題目要求輸出的第二項(xiàng)
這里我用的是set容器將每條為微博中的話題提取出來
還有需要注意的是 這道題不是讓統(tǒng)計(jì)話題的個數(shù)最多的,是看每一條微博里提到的話題 ,無論一條微博里提到幾次,都統(tǒng)計(jì)為這一條微博出現(xiàn)的話題。
三:上碼
/**思路:想辦法將# #中的數(shù)據(jù)提取出來,然后用map容器進(jìn)行存儲m[str] +=1;如果出現(xiàn)相同的話題那就加一,(沒有重復(fù)的m[str]是默認(rèn)為 0 的也就是最后的m[str] == 1)接下來map容器當(dāng)中最后一個值就是最大的當(dāng)然可能會出現(xiàn)重復(fù)的但沒關(guān)系,我們再根據(jù)已知的最大值即可求取,然后相同話題的個數(shù)也就是 題目要求輸出的第二項(xiàng)這里我用的是set容器將每條為微博中的話題提取出來*/#include<bits/stdc++.h> using namespace std;set<string>s[100010]; set<string>:: iterator st; //提取字符串中# #中間的內(nèi)容 void deal(string str,int x){int flag = 0; int count = 0;string word = "";//字符串初始化string str1 = "";str += "!";//給字符串末尾加個結(jié)束標(biāo)志 for( int i = 0; i < str.size(); i++ ){//This is a #test of topic#.if( str[i] == '#'){flag = 1;count++;if( i < str.size() - 1)i++;}if( isalpha(str[i]) && flag == 1 || isdigit(str[i]) && flag == 1){//判斷該字符是否為字母 || 數(shù)字 if( isalpha(str[i])) word += tolower(str[i]);//將大寫英文字母改為小寫英文字母 if( isdigit(str[i]))word += str[i]; }else if( flag == 1 ) {//這里flag = 1 保證取出的字符為##里頭的// cout << word << endl;if( word != " ") str1 += word;word = " ";//清理掉上次的單詞存入新的單詞 (并且給除第一個單詞外的其他單詞加上空格)}//代表一個話題里的熱點(diǎn) if( count == 2){flag = 0;count = 0;//可能一行中有多個#號if(str1 != " " )s[x].insert(str1);word = ""; //當(dāng)一條語句當(dāng)中,會有兩遍熱點(diǎn)話題,那么的話(因?yàn)樵谧詈髨?zhí)行完str1后 word又被賦值為" ",而新的熱點(diǎn)開頭需要的是無空格)str1.clear(); }} } int main(){int N;map<string,int>m2;map<string,int>::iterator t; cin >> N; getchar();for( int i = 0; i < N; i++ ){string str;getline(cin,str);deal(str,i);for( st = s[i].begin(); st != s[i].end(); st++ ){m2[*st] += 1; }} // cout << "******************"<< endl;int max = 0; for( t = m2.begin(); t != m2.end(); t++ ){if( t->second > max ){max = t->second;} }// cout << max << endl;int num; for( t = m2.begin(); t != m2.end(); t++ ){if( t->second == max ){string str = t->first;str[0] = toupper(str[0]);cout << str << endl;cout << t->second << endl;num = t->second;break;} }int count = -1;//把自己先排除掉 for( t = m2.begin(); t != m2.end(); t++ ){if(t->second == num )count++;}//cout << m2.size() << endl;if( count > 0)cout << "And " << count << " more ...";} //4 //This is a #test of topic#. ////This is a #Hot# #Hot# topic //Another #hot!# #Hot# topic//1 //This is a #test of topic#.//1 //Another #hot!# #Hot# topic//Another #Hot# topic//4 //This is a #test of topic#. //Another #Test of topic.# #Hot# //This is a #Hot# #Hot# topic //Another #hot!# #Hot# topic// //Another #Test1 of topic.# //This is a #test of topic#.//Another #hot!# #Hot# topic四:總結(jié)
最后有一個點(diǎn)有剛開始一直段錯誤,那是因?yàn)槲疑戏絪et開的范圍太小了,加大范圍,比題目的10的5次方大就行 加油boy!
五:知識速遞(如果對map容器和set容器不熟悉的兄弟們來這里學(xué)習(xí)一下哈)
map的基本用法
set的基本用法
總結(jié)
以上是生活随笔為你收集整理的7-46 新浪微博热门话题 (30 分)(思路+详解+set + map)pta逐个点过的 来呀兄弟们的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么制作网站外链(怎么制作网站外链链接)
- 下一篇: photoshop人脸怎么颜色合成(ps