题解 | #合并表记录#

合并表记录

https://www.nowcoder.com/practice/de044e89123f4a7482bd2b214a685201


        // Scanner in = new Scanner(System.in);
        //BufferedReader 只能逐行读取原始文本数据,需要手动解析和转换数据类型。

// StreamTokenizer类提供了许多方便的方法来处理输入流中的标记,使得将输入数据转换为需要的数据类型更为简单。它可以自动识别和处理数字、字符串、注释等不同类型的标记,并提供了方法来获取标记的类型和值。

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //保存顺序!!
        Map<Integer, Integer> map = new TreeMap<>();
        int rows = scanner.nextInt();
        for (int i = 0; i < rows; i++) {
            int index = scanner.nextInt();
            int value = scanner.nextInt();
            if (map.containsKey(index)) {
                map.put(index, map.get(index) + value);
            }else {
                map.put(index, value);
            }
        }
        for (Integer index : map.keySet()) {
            System.out.println(index + " " + map.get(index));
        }
    }
}

// hasNext() 方法用于检查输入流中是否还有下一个 token(词法单元),也就是下一个由分隔符(默认包括空格、制表符和换行符)分隔的数据片段。

// import java.util.*;
// import java.io.*;
// public class Main {
//     public static void main(String[] args) throws Exception{
//          StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
//         st.nextToken();      // 分隔符
//         int n = (int) st.nval;   // 强转
//         int[] arr = new int[n];//数组越界!!!!!!!!!!!!!!!!!
 
//         for (int i = 0; i < n; i++) {
//             st.nextToken();
//             int key = (int) st.nval;
//             st.nextToken();
//             int value = (int) st.nval;
//             arr[key] = arr[key] + value;
//         }
 
//         StringBuilder sb = new StringBuilder();
//         for (int i = 0; i < arr.length ; i++) {
//             if(arr[i] != 0){
//                 sb.append(i).append(" ").append(arr[i]).append("\n");
//             }
//         }
//         System.out.println(sb.toString());
//     }
// }

TreeMap保存顺序。

用Gif判断是否contains,不能用三目运算符了。

1. **排序:**

- `TreeMap`会根据键的自然顺序对键值对进行排序,或者根据提供的`Comparator`进行排序。

- `HashMap`不保证键值对的顺序,即插入顺序不会被保存,也不会按照键的顺序进行排序。

2. **性能:**

- `HashMap`的查找、插入和删除操作的时间复杂度为O(1),在大多数情况下性能更好。

- `TreeMap`的查找、插入和删除操作的时间复杂度为O(log n),因为它是基于红黑树实现的。

3. **同步:**

- `HashMap`是非线程安全的,如果需要使用在多线程环境下,需要使用`Collections.synchronizedMap`方法进行包装。

- `TreeMap`也是非线程安全的,如果需要在多线程环境下使用,也需要进行适当的同步操作。

一般来说,如果需要按照键的顺序进行操作或者需要有序地遍历Map,可以选择`TreeMap`。如果对顺序没有特殊要求,而更加关注性能,可以选择`HashMap`。

在Java语言中,三元运算符(conditional operator)的表达式要求有一个确定的返回值,但HashMap.put()方法的返回值是之前与key关联的值,如果之前未关联任何值,则返回null。因此,对于表达式hashmap.containsKey(key) ? hashmap.put(key, value+hashmap.get(key)) : hashmap.put(key, value);无法编译是因为这个表达式的两个分支并没有类型匹配。

if(hashmap.containsKey(key)) {
    hashmap.put(key, value + hashmap.get(key));
} else {
    hashmap.put(key, value);
}

全部评论

相关推荐

亲爱滴达瓦里氏:又有嵌软又有FPGA又有硬件的,三个方向显得你的简历太杂糅了,展示不出你在某一个方向有哪些技术栈。基本上也不会有企业会去招一个本科的全栈工程师。HR一般是看你的技术栈是否和招聘要求匹配才发面试的。如果你想三个方向都试试的话还是建议你分成三份不同的简历根据不同岗位来投。多看看****或牛客上面的招聘信息,根据上面要求的技术栈来写简历。看了你的帖子经历这一块还是过关的,不过看的每个方向都会一点,但每个方向优势都不突出。 还有就是要海投,你这才几十份算不了啥。去年投了一两百份的大有人在。多去跑跑线下招聘吧,有机会继续搞份实习,后面转正机会大些。有条件就多往北上广深投吧。武汉竞争还是太激烈了。
我的秋招日记
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务