描述:
数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
提示:
0 <= index <= 11111111
1 <= value <= 100000
输入描述:
先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
示例1:
输入:
4 0 1 0 2 1 2 3 4输出:
0 3 1 2 3 4
示例2:
输入:
3 0 1 0 2 8 9输出:
0 3 8 9
解题思路:
1、定义结构体数组,每一个结构体元素存储index和value
2、将index相同的结构体的value加到一起,index相同的只保留一个value不为0,其他的在进行合并后置0
3、利用qsort函数对结构体一级排序,排序的关键字为结构体的数组元素的index
4、按序输出value不为0的键值对
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 500
typedef struct {
int index;
int value;
}keyValue;
// 回调比较函数
int cmpfunc (const void* a, const void* b) {
return ( (*(keyValue*)a).index - (*(keyValue*)b).index );
}
int main() {
int n, i, j;
keyValue arr[MAXSIZE];
scanf("%d\n", &n);
for (i = 0; i < n; i++) {
scanf("%d %d\n", &arr[i].index, &arr[i].value);
}
for (i = n - 1; i >= 0; i--) {
for (j = i - 1; j >= 0; j--) {
if (arr[i].index == arr[j].index) {
arr[j].value += arr[i].value;
arr[i].value = 0;
}
}
}
qsort(arr, n, sizeof(arr[0]), cmpfunc);
for (i = 0; i < n; i++) {
if (arr[i].value != 0)
printf("%d %d\n", arr[i].index, arr[i].value);
}
return 0;
}
关于这个回调函数,我有话要说,我们知道,qsort进行排序的时候需要在这个回调函数自定义要比较的关键字和升降序,但是以下这种写法也可以实现对index的升序排序:
int cmpfunc (const void* a, const void* b) {
return ( *(int*)a - *(int*)b );
}
也就是说不指定具体比较关键字的情况下,qsort会对结构体下第一个字段进行比较,也就是index,所以这与结构体成员变量的声明顺序也有关系。