【牛客】HJ8——合并表记录(华为)
题目描述
数据表记录包含表索引和数值(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
- 示例1
输入:
4
0 1
0 2
1 2
3 4
输出:
0 3
1 2
3 4
解题思路
使用TreeMap,其自带排序,若存在key则value相加并覆盖,如果不存在key则把键值对put进TreeMap即可
代码详解(ACM模式)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
boolean flag = true; // 标记是键值对个数还是键值对
int count = 0;
TreeMap<Integer, Integer> tm = new TreeMap<>();
while(input.hasNext()) {
if(flag) { // 如果是键值对个数
count = input.nextInt(); // 读取个数
input.nextLine(); // 这一行代码是读取回车
flag = false; // 转成读取键值对模式
continue;
} else { // 如果读取的是键值对
--count; // 计数器减一直至为0,为0则转成读取键值对个数的模式
if(count == 0) {
flag = true;
}
}
String[] ss = input.nextLine().split(" "); // 读取key和value
int key = Integer.valueOf(ss[0]);
int value = Integer.valueOf(ss[1]);
if(tm.containsKey(key)) {
tm.replace(key, tm.get(key) + value); // 存在key就value相加并覆盖
} else {
tm.put(key, value); // 不存在key就put进去
}
if(flag) { // 代码运行至此,flag为true说明需要输出了
Set<Integer> set = tm.keySet(); // 获取key的集合
for(int num : set) { // 因为内部已排序所以用foreach遍历即可
System.out.println(num + " " + tm.get(num));
}
tm.clear(); // 输出后记得清空
}
}
}
}
注意点
- nextInt()后的nextLine()会读取回车,需再调用一遍nextLine()才能读取下一行数据
- 使用TreeMap可自动在内部进行排序,简少代码量