【CSP试题回顾】201503-2-数字排序

CSP-201503-2-数字排序

解题思路

  1. 数据结构定义:定义了 MyStruct 的结构体,其中包含两个成员:numtimesnum 用于存储整数值,times 用于存储该整数出现的次数。此外,定义了一个 vector<MyStruct> 类型的变量 list,用于存储所有不同的整数及其出现次数。

  2. 输入处理:程序首先读入一个整数 n,表示给定数字的个数。然后通过一个循环读入这些整数。对于每个读入的整数 t,程序会检查它是否已经在 list 中。这一过程通过一个标志变量 flag 辅助实现,其中 flag 初始化为 1,表示假设 t 尚未出现在列表中。

  3. 更新次数或添加新元素:对于每个输入的整数 t,程序遍历 list 来查找是否已经存在该数值。如果找到(即 t 等于 it.num),则将该元素的 times 成员增加 1(表示找到对应的数字,增加出现次数),并将 flag 设置为 0(表示已在列表中找到,无需添加新元素)。如果遍历结束后 flag 仍为 1(即 list 中不存在该整数),则创建一个新的 MyStruct 实例,将 t 赋值给 num,将 1 赋值给 times,并将该新元素添加到 list 中。

  4. 排序:输入处理完成后,使用 sort 函数对 list 进行排序。排序依据是自定义的比较函数 MyCompare,该函数首先比较两个元素的 times 成员,如果一个元素的出现次数多于另一个,则排在前面;如果出现次数相同,则比较 num 成员,数值小的排在前面。

  5. 输出结果:最后,程序遍历排序后的 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;
}

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值