参考
【数据结构1-1】线性表 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
- P3156 【深基15.例1】询问学号
- P3613 【深基15.例2】寄包柜
- P1449 后缀表达式
- P1996 约瑟夫问题
- P1160 队列安排
- P1540 [NOIP2010 提高组] 机器翻译
- P2058 [NOIP2016 普及组] 海港
- P1241 括号序列
- P4387 【深基15.习9】验证栈序列
- P2234 [HNOI2002] 营业额统计
动态数组
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