天天看點

C++混合字元串排序

題一: 有一個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);
}