题解 | #合并表记录#

合并表记录

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

hashmap默认是不排序的,

但是由于键入的key是int,int值的hash还是Int,

只要键入的值小于此时hashmap的初始化大小的数组的时候,就会将键入的值放入数组中,

放入的规则是根据hash值也就是键入的int值的大小。

所以从hashmap的底层原理出发,实现了排序。

https://juejin.cn/post/7182597553110646821

但是其实这个方法是错误的。因为这个解法的问题是:输入的key-value的key小于hashmap的容量时是正确的,比如输入的size是4,那下面的四组数据的key都不能超过4,否则就无法做到升序。因为hashmap的size必须是2的次方的大小,输入size=5,则hashmap的容量其实是2的3次方 = 8.这时候,key小于8的int值可以升序输出,超过(包括)8的话,就不是升序了。

4
0 1
0 2
1 2
20 4


import java.util.Scanner;
import java.util.*;
public class Main {
    public static void main(String agv[]) {
        Scanner scanner = new Scanner(System.in);
        int tableSize = scanner.nextInt();//读取table的大小
        Map<Integer, Integer> table = new HashMap<>(tableSize);//新建一个hashtable
        for (int i = 0; i < tableSize; i++) {//对于每一行
            int key = scanner.nextInt();
            int value = scanner.nextInt();
            if (table.containsKey(key)) {//如果存在key
                table.put(key, table.get(key) + value);//那么就相加
            } else {
                table.put(key, value);//不然就直接放置key 和 value
            }
        }
        for (Integer key : table.keySet()) {
            System.out.println( key + " " + table.get(key));
        }
    }
}


正确的使用treemap的解法

import java.util.Scanner;
import java.io.*;
import java.util.*;

public class Main{
    public static void main(String[] args) throws Exception{
        Scanner sc = new Scanner(System.in);
        TreeMap<Integer, Integer> map = new TreeMap<>(); // 输出结果要求有序!
       while(sc.hasNextInt()){
            int n = sc.nextInt();
            for(int i = 0; i < n; ++i){
                int a = sc.nextInt();
                int b = sc.nextInt();
                map.put(a,map.getOrDefault(a,0) + b);
            }
       }
       for (Integer i : map.keySet()) {
           System.out.println(i + " " + map.get(i));
       }
    }
}

全部评论

相关推荐

我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务