#16841: 排序


freedom501999@gmail.com (帥氣魔方生)

學校 : 不指定學校
編號 : 88611
來源 : [39.8.203.54]
最後登入時間 :
2019-05-30 22:56:25
c012. 10062 - Tell me the frequencies! -- UVa10062 | From: [114.41.96.81] | 發表日期 : 2019-02-12 17:35

ASCII 可以顯示的字元共有 95 個

如果是宣告 ascii [ 95 ] ,根據字元把對應的陣列元素加一

例如空白字元的 ASCII 是 32,則 ascii [ 0 ] ++,這樣就很難排序

所以我宣告 ascii [ 95 ][ 2 ],分別記綠 ASCII 值及出現次數

先依出現次數排序,再依 ASCII 值排序,記得後者只排序次數相同的元素

因為先依出現次數排序後,相同次數的會相鄰,此時只要記綠共有幾個相同次數的元素及其開頭位置即可

 
#35840: Re: 排序


vic20050418@gmail.com (Wen Vic)

學校 : 國立臺灣科技大學
編號 : 153262
來源 : [114.136.159.95]
最後登入時間 :
2023-07-29 13:10:41
c012. 10062 - Tell me the frequencies! -- UVa10062 | From: [42.72.97.109] | 發表日期 : 2023-06-19 06:45

ASCII 可以顯示的字元共有 95 個

如果是宣告 ascii [ 95 ] ,根據字元把對應的陣列元素加一

例如空白字元的 ASCII 是 32,則 ascii [ 0 ] ++,這樣就很難排序

所以我宣告 ascii [ 95 ][ 2 ],分別記綠 ASCII 值及出現次數

先依出現次數排序,再依 ASCII 值排序,記得後者只排序次數相同的元素

因為先依出現次數排序後,相同次數的會相鄰,此時只要記綠共有幾個相同次數的元素及其開頭位置即可

C++可使用Vector+Pair+Sort進行排序,我還有多使用Map來輔助

ex:

命名:
string s;
map<int, int> map;
vector<pair<int, int>> v;
 
字元塞進map再轉成陣列
for (auto c : s) map[int(c)]++;
for (auto i : map) v.push_back({i.first, i.second});
sort(v.begin(), v.end(), tmp);
 
tmp升降函式:
bool tmp(pair<int, int> a, pair<int, int> b) {
  if (a.s == b.s)
    return a.f > b.f;
  else
    return a.s < b.s;
}
 
ZeroJudge Forum