一、网址链接
牛客----https://www.nowcoder.com/ta/huawei
二、题目描述
①描述
数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
提示:
0 <= index <= 11111111
1 <= value <= 100000
②输入描述
先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开
③输出描述
输出合并后的键值对(多行)
④示例一
输入: 4
0 1
0 2
1 2
3 4
输出: 0 3
1 2
3 4
④示例二
输入: 3
0 1
0 2
8 9
输出: 0 3
8 9
三、代码实现
①Java代码实现
import java.util.Scanner;
import java.util.Map;
import java.util.TreeMap;
import java.util.Iterator;
public class Main{
public static void main(String[] args){
Scanner s=new Scanner(System.in);
while(s.hasNext()){
Map<Integer,Integer> map=new TreeMap<Integer,Integer>();
int m=s.nextInt();
for(int i=0;i<m;i++){
int k=s.nextInt();
int v=s.nextInt();
if(map.containsKey(k)){
map.put(k,map.get(k)+v);
}else{
map.put(k,v);
}
}
for(Integer key:map.keySet()){
System.out.println(key+" "+map.get(key));
}
}
}
}
②C++代码实现
#include<iostream>
#include<map>
using namespace std;
int main()
{
int n;
map<int,int> m;
cin>>n;
for(int i=0;i<n;i++)
{
pair<int,int> tmp;
cin>>tmp.first;
cin>>tmp.second;
if((m.find(tmp.first))!=m.end())
m[tmp.first]+=tmp.second;
else
m[tmp.first]=tmp.second;
}
for(auto it=m.begin();it!=m.end();it++)
cout<<it->first<<" "<<it->second<<endl;
return 0;
}
③C代码实现
#include <stdio.h>
typedef struct node{
int ind;
int val;
}node_t;
int main(void){
int i, j;
int n;
int top;
node_t nodes[256];
while(scanf("%d", &n) == 1){
int val, ind;
top = 0;
scanf("%d %d", &nodes[top].ind, &nodes[top].val);
for(i = 1; i < n; ++i){
scanf("%d %d", &ind, &val);
for(j = top; j >= 0; --j){
if(nodes[j].ind == ind){
nodes[j].val += val;
break;
}
}
if(j < 0){
for(j = top; j >=0 && nodes[j].ind > ind; --j){
nodes[j + 1] = nodes[j];
}
nodes[j + 1].ind = ind;
nodes[j + 1].val = val;
++top;
}
}
for(i = 0; i <= top; ++i){
printf("%d %d\n", nodes[i].ind, nodes[i].val);
}
}
return 0;
}