备战蓝桥杯,用JAVA刷洛谷算法题单:【数据结构1-1】线性表

参考

【数据结构1-1】线性表 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

image-20240308101831010

动态数组

P3613 【深基15.例2】寄包柜

使用了嵌套map来表示嵌套的kv对应,如果用list的话不能对应离散的kv,必须连续的(例如初始的时候加入第10个柜子第10号格子的物品,那List就要创建10大小,每次都要这样操作十分不便)。map就可以用来解决离散k+动态数组,十分的不错。

本来20%,仔细看了下题目有个k=0表示清空操作,补充了一下就AC了

package _1_1;

import java.io.*;
import java.util.HashMap;

public class P3613 {
   
    public static void main(String[] args) throws IOException {
   
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        PrintWriter out = new PrintWriter(System.out);
        in.nextToken();
        int n = (int) in.nval;
        in.nextToken();
        int q = (int) in.nval;
        int op, i, j, k;

        // 用map来存储,key表示第几个柜子,value用一个map表示格子,key表示格子编号,value表示格子内容
        HashMap<Integer, HashMap<Integer, Integer>> map = new HashMap<>();
        while (q-- > 0) {
   
            in.nextToken();
            op = (int) in.nval;
            if (op == 1) {
   
                // 存,注意k==0表示清空格子
                in.nextToken();
                i = (int) in.nval;
                in.nextToken();
                j = (int) in.nval;
                in.nextToken();
                k = (int) in.nval;
                // 先判断柜子存不存在
                if (!map.containsKey(i)) {
   
                    // 创建柜子直接放入
                    HashMap<Integer, Integer> gezi = new HashMap<>();
                    gezi.put(j, k);
                    map.put(i, gezi);
                } else {
   
                    // 柜子i存在,判断格子j存不存在
                    HashMap<Integer, Integer> gezi = map.get(i);
                    if (!gezi.containsKey(j)) {
   
                        // 在原有格子map中放入新得key(这里容易混)
                        gezi.put(j, k);
                        map.put(i, gezi);
                    } else {
   
                        // 重复放入物品(这里会涉及到清空)
                        // 上面的操作都是直接放入k,就算k=0也不影响,但是重复是需要加法得
                        if (k != 0) {
   
                            Integer integer = gezi.get(j);
                            gezi.put(j, integer + k);
                        } else {
   
                            gezi.put(j, k);
                        }
                        map.put(i, gezi);
                    }
                }
            } else {
   
                // 查
                in.nextToken();
                i = (int
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值