合并表记录
描述
数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
提示:
0 <= index <= 11111111
1 <= value <= 100000
- 输入描述:
先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开
- 输出描述:
输出合并后的键值对(多行)
#include <iostream>
#include <string>
using namespace std;
//定义一个结构体
typedef struct chart {
int index = -1;
int value = -1;
} Chart;
//快速排序
void quick_sort(Chart num[], int low, int high) {
int i, j;
Chart tmp, temp;
i = low;
j = high;
tmp = num[low]; //任命为中间分界线,左边比他小,右边比他大,通常第一个元素是基准数
if (i > j) { //如果下标i大于下标j,函数结束运行
return;
}
while (i != j) {
while (num[j].index >= tmp.index && j > i) {
j--;
}
while (num[i].index <= tmp.index && j > i) {
i++;
}
if (j > i) {
temp = num[j];
num[j] = num[i];
num[i] = temp;
}
}
num[low] = num[i];
num[i] = tmp;
quick_sort(num, low, i - 1);
quick_sort(num, i + 1, high);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);//这三行加速输入输出
int n;
while (cin >> n) {
//开辟结构体数组空间
Chart* p1 = new Chart[n];
for (int i = 0; i < n; i++) {
cin >> p1[i].index >> p1[i].value;
}
//使用快排对其排序
quick_sort(p1, 0, n - 1);
for (int i = 0, j = 1; i < n; i++) {
if (p1[i].index == p1[j].index) {
p1[j].value += p1[i].value;
} else {
cout << p1[i].index << ' ' << p1[i].value << endl;
}
j++;
}
}
return 0;
}
写完才发现整多了,C++有一个map库自带键值对,等一些操作函数。
首先,定义一个结构体(键值对):
本来一开始是想用链表来实现的,后面发现解这题貌似不是很有必要就稍微改良了一下,就定义了一个结构体Chart;
第二步,先排序:
我选用了时间复杂度相对较低的快速排序,具体实现步骤在代码中会有所体现,而方法原理我是推荐这篇文章。
***********************************************************
第三步,逐层压缩合并:
用一个for循环即可实现压缩打印,思路如下:
- 设置两个“指针”i,j
- 由于数据是已经按照其index排好序的,所以若其index相同,那么必定是相邻的两个数据。判断指针i对应的index值是否与j对应的index值相同,相同则将其value值向后累加,直到不相同时将其输出即可。