題一: 有一個txt檔案,裡面都是空格或者回車分隔的英文單詞。請寫一個程式,輸入檔案名,輸出檔案中出現次數最多的前20個單詞。
1,使用 unordermap統計字元出現次數
2,将unordermap統計後的次數轉化成pair 的vector ,
3,調用sort函數自定義排序規則進行排序。
#include <iostream>
#include <unordered_map>
#include <string>
#include <vector>
#include <sstream>
#include <fstream>
#include <iterator>
#include <algorithm>
using namespace std;
vector<string> FindMaxCountWords01()
{
ifstream in("in.txt");
string line;
unordered_map<string, int> wordMap;
vector<string> res;
while (getline(in, line))
{
stringstream ss(line);
string word;
while (ss >> word) ++wordMap[word];
}
vector<pair<string, int>> vec;
for (const auto &m : wordMap) vec.push_back(m);
sort(vec.begin(), vec.end(), [](const pair<string, int> &p1, const pair<string, int> &p2) { return p1.second > p2.second; });
for(int loop = 0;loop < min(20, static_cast<int> (vec.size()));loop++)
{
res.push_back(vec[loop].first);
}
return res;
}
題二:混合字元串數組的排序,輸入字元串數組/vector,輸出,遞增排序後的字元串數組/vector
兩個字元串(字元串1、字元串2)的大小比較,字元串可能既含有字元(a~z)又含有數字(0~9)。比較規則:
(1)從左到右分離單純的子字元串(全字元)和子數字串(全數字)進行比較。
(2)如果被比較的都是子字元串,則可以調用strcmp比較子字元串大小。
(3)如果被比較的都是子數字串,則根據值比較大小,如果值相等,則子數字串短的一方大(前面的0少)。
(4)如果被比較的一邊是子數字串,一邊是子字元串,則子字元串大。
測試例子,對字元串組B1,B01,B2,B11進行遞增排序:輸出應該是B01,B1,B2,B11。
調用sort函數對vector排序,自定義規則。
1,對string 正則比對切分。
2,對切分的每一個字串按照相關規則進行比較。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
#include <regex>
#include <string.h>
using namespace std;
bool comp(const string &s1, const string &s2)
{
regex e(R"(\d+|[a-z,A-Z]+)");
string s1Sub,s2Sub;
sregex_iterator iter1(s1.begin(), s1.end(), e);
sregex_iterator end1;
sregex_iterator iter2(s2.begin(), s2.end(), e);
sregex_iterator end2;
for(;(iter1 != end1) && (iter2 != end2); ++iter1,++iter2)
{
s1Sub = (*iter1)[0];
s2Sub = (*iter2)[0];
if(s1Sub.compare(s2Sub) == 0) continue;
if(regex_match(s1Sub, regex("\\d+")) && regex_match(s2Sub, regex("\\d+"))){
return (stoi(s1Sub) == stoi(s2Sub)) ? (s1Sub.size() > s2Sub.size()) : (s1Sub < s2Sub);}
else if(regex_match(s1Sub, regex("\\w+")) && regex_match(s2Sub, regex("\\w+"))){
return strcmp(s1Sub.c_str(),s2Sub.c_str()) > 0 ? true : false;}
else{
return regex_match(s1Sub, regex("\\d+"));}
}
return true;
}
void SortString(vector<string> &vec)
{
sort(vec.begin(), vec.end(),comp);
}