华为机试——合并表记录

来源:互联网 发布:淘宝助理手机版最新 编辑:程序博客网 时间:2024/05/16 08:07

题目描述

数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
示例1
输入

40 10 21 23 4

输出

0 31 23 4

思路:
利用map的key值无重复:如果当前的第一个数在res的index中,那么直接将这个index对应的value值加上第二个值;否则将这个键值对放到map里。具体思路见注释。

代码:

#include <iostream>#include <sstream>#include <string>#include <map>using namespace std;int main(){    int N;    string s;    stringstream ss;//string流,非常好用!    int input1,input2;    getline(cin,s);//输入第一个参数:键值对个数,这里要用getline    ss.clear();    ss.str(s);    ss >> N;//利用stringstream转成int型    map<int,int> res;//map的index(其实是key)无重复,保存结果    while (N){        getline(cin, s);        ss.clear();        ss.str(s);        ss >> input1;        ss >> input2;//输入一行,一行有两人个数据        if (res.count(input1)){//如果当前的第一个数在res的index中,那么直接将这个index对应的value值加上第二个值            res[input1] += input2;        }        else{//否则将这个键值对放到map里,用到了pair            res.insert(pair<int, int>(input1, input2));        }        --N;    }    for (map<int, int>::iterator iter = res.begin(); iter != res.end(); ++iter){//输出结果        cout << iter->first << " " << iter->second << endl;    }    return 0;}

输出结果: 运行时间: 5 ms 占用内存:368K 状态:答案正确