刷题日记day14-字符串-数组去重和排序
文章目录
- 前言
- 一、问题复述
- 二、解法及其思想
- 三、代码实现及细节(仅算法相关部分)
前言
简单写个日记记录我刷了什么题以及心得总结。
一、问题复述
- 给定一个有重复元素的乱序数组,要求按照元素出现次数从高到底排序,并且相同出现次数间按照元素的第一次出现顺序进行排序。
- 输入:一行元素组成的数组
- 输出:去重排序后数组
例:
输入
1,3,3,3,2,4,4,4,5
输出
3,4,1,2,5
二、解法及其思想
- 分别用unordered_map<int,int>记录元素初次出现位置occur和出现频率fre,再记录非重复元素序列unique,最后按照出现频率和出现位置对unique进行自定义排序即可。
三、代码实现及细节(仅算法相关部分)
#include<iostream>
#include<unordered_map>
#include<string>
#include<sstream>
#include<algorithm>
#include<vector>
using namespace std;
void replace(string& s) {
for (auto& e : s) {
if (e == ',')e = ' ';
}
}
vector<int> ans(vector<int> a) {
unordered_map<int, int> fre;//元素出现频率
unordered_map<int, int> occur;//元素第一次出现位置
vector<int> unique;//目标唯一元素序列
for (int i = 0; i < a.size(); i++) {
if (fre.find(a[i]) == fre.end()) {
occur[a[i]] = i;
unique.push_back(a[i]);
}
fre[a[i]]++;
}
//自定义排序规则:先排出现频率,再排出现位置
auto cmp = [&](int a, int b) {
if (fre[a] != fre[b])return fre[a] > fre[b];
else return occur[a] < occur[b];
};
sort(unique.begin(), unique.end(),cmp);
for (int i = 0; i < unique.size() - 1;i++) {
cout << unique[i] << ",";
}
cout << unique[unique.size() - 1];
return unique;
}
int main() {
string s;
getline(cin, s);
replace(s);
istringstream iss(s);
int n;
vector<int> a;
int i = 0;
while (iss >> n) {
a.push_back(n);
}
ans(a);
return 0;
}