【题解 | 合并表记录】

合并表记录

描述

数据表记录包含表索引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值向后累加,直到不相同时将其输出即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值