日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

7-46 新浪微博热门话题 (30 分)(思路+详解+set + map)pta逐个点过的 来呀兄弟们

發布時間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7-46 新浪微博热门话题 (30 分)(思路+详解+set + map)pta逐个点过的 来呀兄弟们 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 :題目

新浪微博可以在發言中嵌入“話題”,即將發言中的話題文字寫在一對“#”之間,就可以生成話題鏈接,點擊鏈接可以看到有多少人在跟自己討論相同或者相似的話題。新浪微博還會隨時更新熱門話題列表,并將最熱門的話題放在醒目的位置推薦大家關注。

本題目要求實現一個簡化的熱門話題推薦功能,從大量英文(因為中文分詞處理比較麻煩)微博中解析出話題,找出被最多條微博提到的話題。

輸入格式:
輸入說明:輸入首先給出一個正整數N(≤10
5
),隨后N行,每行給出一條英文微博,其長度不超過140個字符。任何包含在一對最近的#中的內容均被認為是一個話題,輸入保證#成對出現。

輸出格式:
第一行輸出被最多條微博提到的話題,第二行輸出其被提到的微博條數。如果這樣的話題不唯一,則輸出按字母序最小的話題,并在第三行輸出And k more …,其中k是另外幾條熱門話題的條數。輸入保證至少存在一條話題。

注意:兩條話題被認為是相同的,如果在去掉所有非英文字母和數字的符號、并忽略大小寫區別后,它們是相同的字符串;同時它們有完全相同的分詞。輸出時除首字母大寫外,只保留小寫英文字母和數字,并用一個空格分隔原文中的單詞。

輸入樣例:

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 ...

二:思路分析

思路:想辦法將# #中的數據提取出來,然后用map容器進行存儲m[str] +=1;如果出現相同的話題
那就加一,(沒有重復的m[str]是默認為 0 的也就是最后的m[str] == 1)
接下來map容器當中最后一個值就是最大的當然可能會出現重復的但沒關系,我們再根據已知
的最大值即可求取,然后相同話題的個數也就是 題目要求輸出的第二項

這里我用的是set容器將每條為微博中的話題提取出來
還有需要注意的是 這道題不是讓統計話題的個數最多的,是看每一條微博里提到的話題 ,無論一條微博里提到幾次,都統計為這一條微博出現的話題。

三:上碼

/**思路:想辦法將# #中的數據提取出來,然后用map容器進行存儲m[str] +=1;如果出現相同的話題那就加一,(沒有重復的m[str]是默認為 0 的也就是最后的m[str] == 1)接下來map容器當中最后一個值就是最大的當然可能會出現重復的但沒關系,我們再根據已知的最大值即可求取,然后相同話題的個數也就是 題目要求輸出的第二項這里我用的是set容器將每條為微博中的話題提取出來*/#include<bits/stdc++.h> using namespace std;set<string>s[100010]; set<string>:: iterator st; //提取字符串中# #中間的內容 void deal(string str,int x){int flag = 0; int count = 0;string word = "";//字符串初始化string str1 = "";str += "!";//給字符串末尾加個結束標志 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){//判斷該字符是否為字母 || 數字 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 = " ";//清理掉上次的單詞存入新的單詞 (并且給除第一個單詞外的其他單詞加上空格)}//代表一個話題里的熱點 if( count == 2){flag = 0;count = 0;//可能一行中有多個#號if(str1 != " " )s[x].insert(str1);word = ""; //當一條語句當中,會有兩遍熱點話題,那么的話(因為在最后執行完str1后 word又被賦值為" ",而新的熱點開頭需要的是無空格)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

四:總結

最后有一個點有剛開始一直段錯誤,那是因為我上方set開的范圍太小了,加大范圍,比題目的10的5次方大就行 加油boy!

五:知識速遞(如果對map容器和set容器不熟悉的兄弟們來這里學習一下哈)

map的基本用法
set的基本用法

總結

以上是生活随笔為你收集整理的7-46 新浪微博热门话题 (30 分)(思路+详解+set + map)pta逐个点过的 来呀兄弟们的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。