Java题解 | HJ8 #合并表记录#
合并表记录
https://www.nowcoder.com/practice/de044e89123f4a7482bd2b214a685201
描述
数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
提示:
0 <= index <= 11111111
1 <= value <= 100000
输入描述:先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开
输出描述:输出合并后的键值对(多行)
解释
该题与“HJ2 计算某字符出现次数”类似,主要运用Map来存储输入的键值对,相同key的值做聚合。由于涉及到key的排序,因此使用TreeMap来作为结构是最为合适的。
/* * Copyright (c) waylau.com, 2022. All rights reserved. */ package com.waylau.nowcoder.exam.oj.huawei; import java.util.Map; import java.util.Scanner; import java.util.TreeMap; /** * HJ8 合并表记录. * 描述:数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。 * 输入描述:先输入键值对的个数n(1 <= n <= 500) * 接下来n行每行输入成对的index和value值,以空格隔开 * 输出描述:输出合并后的键值对(多行) * * @author <a href="https://waylau.com">Way Lau</a> * @since 2022-08-07 */ public class HJ8MergeTableRecords { public static void main(String[] args) { // 输入一行,代表要计算值 Scanner sc = new Scanner(System.in); int num = sc.nextInt(); // 构造一个TreeMap结构 Map<Integer, Integer> map = new TreeMap<>(); // 对输入字符串进行遍历,将每遍历一个字符,就将该字符记录到哈希中 int i = 0; boolean flag = true; while (flag) { int index = sc.nextInt(); int value = sc.nextInt(); // 之前就记过,就累加个数;否则就记1 Integer valueInMap = map.get(index); if (valueInMap != null) { valueInMap += value; } else { valueInMap = value; } map.put(index, valueInMap); i++; // 总共执行num次 if (i == num) { flag = false; } } // 按照index值升序进行输出index、value map.forEach((index, value) -> { System.out.println(index + " " + value); }); // 关闭资源 sc.close(); } }
运行程序输出结果如下:
4
0 1
0 2
1 2
3 4
0 3
1 2
3 4
参考引用
- 本系列归档至https://github.com/waylau/nowcoder-exam-oj
- 《Java 数据结构及算法实战》:https://github.com/waylau/java-data-structures-and-algorithms-in-action
- 《数据结构和算法基础(Java 语言实现)》(柳伟卫著,北京大学出版社出版):https://item.jd.com/13014179.html
#华为机考#