数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
输入:(index value)
4 0 1 0 2 1 2 3 4
输出:(index value)
0 3 1 2 3 4
参照之前的去重和排序的简易算法,可以直接得出结果:
其中a[]可理解为a[index]=value
#include<iostream>
using namespace std;
int main() {
int number;
while (cin >> number) {
int i = 0;
int j = 0;
int a[1000] = { 0 };
for (int z = 0; z < number;z++) {
cin >> i >> j;
a[i] += j;
}
for (int t = 0; t < 1000; t++) {
if (a[t]!=0) { cout << t << " " << a[t] << endl; }//将没有初始化的不输出
}
}
return 0;
}
但该方法有缺点如下:
1.如果表的index过大,不知道最大值,那么初始化后,使用数组可能出现越界
2.如果表的value有正有负,就无法用0来判别是否有数据存入
所以,另一种方法,就是通过结构体,先进行排序,再将相同index的value合并,代码如下:
#include<iostream>
using namespace std;
struct A {
int index;
int value;
};
int main() {
int number;
while (cin >> number) {
A a[1000];
for (int i = 0; i < number;i++) {
cin >> a[i].index >> a[i].value;
}
for (int i = 0; i < number;i++) {
for (int j = i+1; j < number;j++) {
if (a[i].index > a[j].index) {//交换
A tmp;
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}
for (int i = 0; i < number;i++) {
int index=a[i].index;
int value=a[i].value;
for (; a[i].index == a[i + 1].index;) {
i++;
value += a[i].value;
}
cout << index << " " << value << endl;
}
}
return 0;
}
该方法开销较大(因有排序),但适用于一般情况