按出現次數從少到多的順序輸出數組中的字元串
問題
有一個數組為{"Liu Yi", "Chen Er", "Zhang San", "Chen Er", "Chen Er", "Li Si", "Li Si", "Wang Wu"},
要求:(1)把數組中沒重複的字元串按原先的先後順序列印出來(2)把數組中有重複的字元串,按出現次數從少到多的順序列印出來,每個字元串只列印一次
思路
把字元串作為key、出現次數作為value,存到map中;
再把第一個map中的出現次數作為key、對應的字元串作為value,存到map>中。演算法的時間複雜度為N。代碼
#include <iostream>#include <map>#include <list>using namespace std;#define len 8int main(){ string s[len] = {"Liu Yi", "Chen Er", "Zhang San", "Chen Er", "Chen Er", "Li Si", "Li Si", "Wang Wu"}; map<string, int> m; map<int, list<string> > m2; for(int i = 0; i < len; i++) { int cnt = 0; if(m.count(s[i]) > 0) { cnt = m[s[i]]; } m[s[i]] = ++cnt; //把重複次數和list<string>存到另一個map中 list<string> li; if(m2.count(cnt) > 0) { // 若key已經存在,則使用key所對應的list,而不是用新生成的list li = m2[cnt]; } if(cnt > 1) { // 若重複次數從n變為n+1(這裡n大於或等於1) // 要把元素從n所對應的list中移出,放到n+1所對應的list中 list<string> oldList = m2[cnt - 1]; oldList.remove(s[i]); m2[cnt - 1] = oldList; } li.push_back(s[i]); m2[cnt] = li; } map<int, list<string> >::iterator it; for(it = m2.begin(); it != m2.end(); it++) { int cnt2 = it->first; list<string> list2 = m2[cnt2]; list<string>::iterator it2; for(it2 = list2.begin(); it2 != list2.end(); it2++) { cout << *it2 << endl; } } return 0;}
運行結果:
Liu YiZhang SanWang WuLi SiChen Er
推薦閱讀:
※機器學習:神經網路的模型構建
※演算法:3. Longest Substring Without Repeating Characters
※鏈表中環的入口節點
※自動駕駛還在盯著「演算法」和「感測器」么?風河打算為其開發通用底層操作系統了
※偽·從零開始學演算法 - 1.1 演算法的簡述
TAG:演算法 |