题目描述
数据表记录包含表索引index和数值value,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
输入描述
先输入键值对的个数n,然后输入成对的index和value值,用空格隔开。
1 ≤ n ≤ 5000 ≤ index ≤ 111111111 ≤ value ≤ 100000
输出描述
输出合并后的键值对(多行),格式为index value,按index升序排列。
示例
输入:
text
4 0 1 0 2 1 3 3 4
输出:
text
0 3 1 3 3 4
说明:索引 0 出现两次,值 1 + 2 = 3;其余索引只出现一次。
C 语言解决方案
思路
由于index最大可达11111111(约一千万),直接用数组当桶会超内存(1000 万 × 4 字节 ≈ 40MB,勉强但偏大)。
更稳妥的做法:
用一个结构体数组存放
(index, value)。按
index排序。遍历排序后的数组,相邻相同
index的值累加后输出。
这里使用qsort排序。
代码实现
c
#include <stdio.h> #include <stdlib.h> typedef struct { int index; int value; } Record; // qsort 的比较函数:按 index 升序 int cmp(const void *a, const void *b) { Record *ra = (Record *)a; Record *rb = (Record *)b; if (ra->index != rb->index) { return ra->index - rb->index; } return 0; } int main(void) { int n; scanf("%d", &n); Record recs[505]; for (int i = 0; i < n; i++) { scanf("%d %d", &recs[i].index, &recs[i].value); } // 按 index 升序排序 qsort(recs, n, sizeof(Record), cmp); // 遍历合并相邻相同 index 的记录 for (int i = 0; i < n; ) { int idx = recs[i].index; int sum = 0; int j = i; // 累加所有相同 index 的 value while (j < n && recs[j].index == idx) { sum += recs[j].value; j++; } printf("%d %d\n", idx, sum); i = j; // 跳过已处理的记录 } return 0; }代码说明
| 步骤 | 说明 |
|---|---|
结构体Record | 把 index 和 value 绑定在一起,便于整体排序 |
qsort+cmp | 按 index 升序排序,为后续合并做准备 |
内层while | 遇到相同 index 就累加,天然完成合并 |
i = j | 跳过已处理的所有相同 index 记录 |
复杂度分析
时间复杂度:O(n log n),主要是排序的开销;合并遍历为 O(n)。
空间复杂度:O(n),存储记录数组。
测试用例
| 输入 | 输出 |
|---|---|
40 10 21 33 4 | 0 31 33 4 |
35 105 205 30 | 5 60 |
2100 11 2 | 1 2100 1 |