【牛客】HJ8——合并表记录(华为)

【牛客】HJ8——合并表记录(华为)

题目描述

数据表记录包含表索引和数值(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。

输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开

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

  1. 示例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();	// 输出后记得清空
            }
        }
    }
}

注意点

  1. nextInt()后的nextLine()会读取回车,需再调用一遍nextLine()才能读取下一行数据
  2. 使用TreeMap可自动在内部进行排序,简少代码量
上一篇:spring-data-redis 上百万的 QPS 压力太大连接失败,我 TM 人傻了


下一篇:Java继承封装多态抽象理解,算法太TM重要了