PTA 7 14詞頻統計 30分

2021-10-10 21:21:41 字數 1630 閱讀 1251

題目:

請編寫程式,對一段英文文字,統計其中所有不同單詞的個數,以及詞頻最大的前10%的單詞。

所謂「單詞」,是指由不超過80個單詞字元組成的連續字串,但長度超過15的單詞將只擷取保留前15個單詞字元。而合法的「單詞字元」為大小寫字母、數字和下劃線,其它字元均認為是單詞分隔符。

輸入格式:

輸入給出一段非空文字,最後以符號#結尾。輸入保證存在至少10個不同的單詞。

輸出格式:

在第一行中輸出文字中所有不同單詞的個數。注意「單詞」不區分英文大小寫,例如「pat」和「pat」被認為是同乙個單詞。

隨後按照詞頻遞減的順序,按照詞頻:單詞的格式輸出詞頻最大的前10%的單詞。若有並列,則按遞增字典序輸出。

輸入樣例:

this is a test.

the word 「this」 is the word with the highest frequency.

longlonglonglongword should be cut off, so is considered as the same as longlonglonglonee. but this_8 is different than this, and this, and this…#

this line should be ignored.

輸出樣例:(注意:雖然單詞the也出現了4次,但因為我們只要輸出前10%(即23個單詞中的前2個)單詞,而按照字母序,the排第3位,所以不輸出。)
23

5:this

4:is

思路:
簡單模擬。map儲存字串出現次數,用struct來存並且排序,先全部大寫換小寫利於儲存排序,然後遇到有效字元即讀取存入a,否則將a存入map中並清空a,繼續操作直到讀到最後。

需要注意的是會讀入空格,所以需要進行判斷是否當前位置前沒有讀入過空格。

map存字串的時候是通過是否為第一次出現來給struct編序號的,然後map的值轉化為相應序號進行struct的操作。

(聽說字典樹才是正解,但是對於我這種樹痴來說,模擬,yyds!)

ac**:
#include

using

namespace std;

#define inf 0x3f3f3f

string a;

mapint>p;

struct node

h[101000];

bool

cmp(node a,node b)

intmain()

int l=s.

size()

;for

(int i=

0; i)int k=0;

int f=0;

for(

int i=

0; i)else

else

a.clear()

;}}}

sort

(h+1

,h+k+

1,cmp)

; cout

int i=

1; i<=k/

10; i++

)return0;

}

PTA 7 14 電話聊天狂人

這個題是乙個 map 應用的題目,但是由於測試點的特殊性,還是有需要注意的點。這道題的額外收穫是學習到了如何根據 map 的value 排序。給定大量手機使用者聯絡歷史,找出其中通話次數最多的聊天狂人。輸入格式 輸入首先給出正整數n 105 為聯絡歷史條數。隨後n行,每行給出一條聯絡歷史。簡單起見,...

PTA 7 14 求整數段和 15分

給定兩個整數a和b,輸出從a到b的所有整數以及這些數的和。輸入格式 輸入在一行中給出2個整數a和b,其中 100 a b 100,其間以空格分隔。輸出格式 首先順序輸出從a到b的所有整數,每5個數字佔一行,每個數字佔5個字元寬度,向右對齊。最後在一行中按sum x的格式輸出全部數字的和x。輸入樣例 ...

PTA 7 14 求整數段和

7 14 求整數段和 15分 給定兩個整數a和b,輸出從a到b的所有整數以及這些數的和。輸入格式 輸入在一行中給出2個整數a和b,其中 100 a b 100,其間以空格分隔。輸出格式 首先順序輸出從a到b的所有整數,每5個數字佔一行,每個數字佔5個字元寬度,向右對齊。最後在一行中按sum x的格式...