Problem: HJ8 合并表记录
题目描述
描述
数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
提示:
输入描述:
先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
示例1
输入:
4
0 1
0 2
1 2
3 4
输出:
0 3
1 2
3 4
解题思路
将相同索引的记录进行合并求和,最后按照索引值升序输出结果。
算法流程
- 它使用
Scanner类创建一个输入对象in,并通过in.hasNextInt()判断是否还有输入数据。- 在一个循环中,它首先读取一个整数
n,表示接下来要读取的记录数量。- 计算
num的平方根,并将其赋值给变量k。- 创建一个
Map对象map,用于存储索引和对应的数值。- 它使用一个循环读取
n个记录,每个记录包含两个整数k和v,分别表示索引和数值。它使用map.put(k,map.getOrDefault(k,0)+v)将相同索引的数值进行求和,并将结果存储在map中。- 它使用一个循环遍历
map的键集合,并按照索引值升序输出结果。
代码
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int n = in.nextInt();
Map<Integer,Integer> map = new TreeMap<>();
for (int i = 0; i < n; i++) {
int k = in.nextInt();
int v = in.nextInt();
map.put(k,map.getOrDefault(k,0)+v);
}
for(Integer i : map.keySet()){
System.out.println(i+" "+map.get(i));
}
}
}
}
复杂度
- 时间复杂度:
添加时间复杂度, 示例:
- 外层循环的时间复杂度为O(N),其中N是输入的记录数量。
- 内层循环的时间复杂度为O(logN),其中N是
map中的键值对数量。- 打印
map中的键值对的时间复杂度为O(N),其中N是map中的键值对数量。
- 空间复杂度:
添加空间复杂度, 示例:
map对象的空间复杂度为O(N),其中N是输入的记录数量。- 其他变量的空间复杂度为O(1)。