华为OD 数组去重和排序 C++源码实现,100%通过
目录
题目描述:
示例1
代码实现:
题目描述:
给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。
输入描述
一个数组
输出描述
去重排序后的数组
示例1
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
1,3,3,3,2,4,4,4,5
输出
3,4,1,2,5
备注
数组大小不超过100
数组元素值大小不超过100
代码实现:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <sstream>using namespace std;int getIdx(vector<int> &arr, int tar) {for (int i = 0; i < arr.size(); ++i) {if (arr[i] == tar) return i;}return -1;
}
bool cmp(vector<int> &first, vector<int> &second) {if (first[1] != second[1]) {return first[1] > second[1];}else {return first[2] < second[2];}
}
int main()
{string s;getline(cin, s);replace(s.begin(), s.end(), ',', ' ');stringstream ss(s);int v;vector<int> arr;unordered_map<int, int> ump;while (ss >> v) {arr.push_back(v);ump[v]++;}vector<vector<int>> ans;for (auto it : ump) {ans.push_back({ it.first,it.second,getIdx(arr,it.first) });}sort(ans.begin(), ans.end(), cmp);for (int i = 0; i < ans.size() - 1; ++i) {cout << ans[i][0] << ",";}cout << ans.back()[0] << endl;return 0;
}