HJ8 合并表记录

96 阅读2分钟

Problem: HJ8 合并表记录

题目描述

描述

数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
提示:
0<= index <=111111110 <= index <= 11111111
1<=value<=1000001 <= value <= 100000

输入描述:

先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开

输出描述:

输出合并后的键值对(多行)

示例1

输入:4
0 1
0 2
1 2
3 4
输出:
0 3
1 2
3 4

解题思路

将相同索引的记录进行合并求和,最后按照索引值升序输出结果。

算法流程

  1. 它使用Scanner类创建一个输入对象in,并通过in.hasNextInt()判断是否还有输入数据。
  2. 在一个循环中,它首先读取一个整数n,表示接下来要读取的记录数量。
  3. 计算num的平方根,并将其赋值给变量k
  4. 创建一个Map对象map,用于存储索引和对应的数值。
  5. 它使用一个循环读取n个记录,每个记录包含两个整数kv,分别表示索引和数值。它使用map.put(k,map.getOrDefault(k,0)+v)将相同索引的数值进行求和,并将结果存储在map中。
  6. 它使用一个循环遍历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(nlogn)O(n*log^n)

  • 外层循环的时间复杂度为O(N),其中N是输入的记录数量。
  • 内层循环的时间复杂度为O(logN),其中N是map中的键值对数量。
  • 打印map中的键值对的时间复杂度为O(N),其中N是map中的键值对数量。
  • 空间复杂度:

添加空间复杂度, 示例: O(N)O(N)

  • map对象的空间复杂度为O(N),其中N是输入的记录数量。
  • 其他变量的空间复杂度为O(1)。