解题思路
-
数据结构定义:定义了
MyStruct
的结构体,其中包含两个成员:num
和times
。num
用于存储整数值,times
用于存储该整数出现的次数。此外,定义了一个vector<MyStruct>
类型的变量list
,用于存储所有不同的整数及其出现次数。 -
输入处理:程序首先读入一个整数
n
,表示给定数字的个数。然后通过一个循环读入这些整数。对于每个读入的整数t
,程序会检查它是否已经在list
中。这一过程通过一个标志变量flag
辅助实现,其中flag
初始化为1
,表示假设t
尚未出现在列表中。 -
更新次数或添加新元素:对于每个输入的整数
t
,程序遍历list
来查找是否已经存在该数值。如果找到(即t
等于it.num
),则将该元素的times
成员增加1
(表示找到对应的数字,增加出现次数),并将flag
设置为0
(表示已在列表中找到,无需添加新元素)。如果遍历结束后flag
仍为1
(即list
中不存在该整数),则创建一个新的MyStruct
实例,将t
赋值给num
,将1
赋值给times
,并将该新元素添加到list
中。 -
排序:输入处理完成后,使用
sort
函数对list
进行排序。排序依据是自定义的比较函数MyCompare
,该函数首先比较两个元素的times
成员,如果一个元素的出现次数多于另一个,则排在前面;如果出现次数相同,则比较num
成员,数值小的排在前面。 -
输出结果:最后,程序遍历排序后的
list
,按照出现次数递减的顺序输出每个整数及其出现次数。如果两个整数出现次数相同,则按照数值大小升序输出。
完整代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct MyStruct
{
int num;
int times;
};
vector<MyStruct>list;
bool MyCompare(const MyStruct& a, const MyStruct& b) {
if (a.times > b.times) return true;
else if (a.times == b.times) {
if (a.num < b.num) return true;
else return false;
}
else return false;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
int t;
cin >> t;
bool flag = 1; // 1:list中没有找到对应的数字
for (auto& it : list)
{
if (t == it.num)
{
flag = 0; // 0:list中找到对应的数字
it.times++;
break;
}
}
if (flag) // 添加新数字
{
MyStruct tt;
tt.num = t, tt.times = 1;
list.push_back(tt);
}
}
sort(list.begin(), list.end(), MyCompare); // 排序
for (auto& it : list)
{
cout << it.num << " " << it.times << endl;
}
return 0;
}