先上题目 🌺
题目出处: CCF 202305-1
省流版解读 👇
每8✖8是一个局面,一共是n个局面,遍历这n个局面,判断当前局面在之前出现过几次
没出现过标为1 表示第一次出现
💡 思路
- 用 Map 这种数据结构存储,key 存储局面,value 存储次数;
⭐ 细节
- key 的类型是 String,不要写成 StringBuilder,因为 StringBuilder 底层没有重写 equals 方法,默认比较的是地址,因此不管怎么存,都会当做第一次出现
- 这里比较的是局面,应该是字符串的值,不是地址;
- map 里出现键冲突时,也就是尝试存2个相同的 key 值,后存的 value 会覆盖之前的 value,
而不是新建一条记录
- 因此,如果直接无脑存,最后再全部取出来,可能结果会是 111 22 1,不是样例1里的11111 22 1
📷 代码
文字版 🌳
import java.util.*;
public class Main1 {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int index = 0;
int[] ans = new int[n];
for (int j = 0; j < n; j++) { //一共n个局面
StringBuilder sbBuilder = new StringBuilder();
for (int i = 0; i < 8; i++) { //8行拼成一个局面
sbBuilder.append(sc.next());
}
int num = map.getOrDefault(sbBuilder.toString(), 0);
//用num判断map里存了没有 如果没存,num为0;存了就是存的个数
ans[index++] = num + 1; //用ans额外记录当前局面在之前出现过几次(没存就是第一次出现 ans里存1)
map.put(sbBuilder.toString(), num + 1);
//把当前局面存到map里 如果num为0,则代表没有这样的key,会新增一条;如果num不为0 出现次数就加1
}
for (int content : ans) {
System.out.println(content);
}
}
}
🐉 解释
- num 的作用:表示在当前字符串存入之前,Map 中已有的记录数;
- Map 的作用:每次传一个字符串,判断存的有没有。有的话,把当前的存进去,即 value 加 1;没有的话,新建一条记录;
- ans 的作用:返回的答案,即 answer,用 index 表示下标,往数组中按顺序存结果;
ps: 这题用HashMap和LinkedHashMap都可以,区别是前者存放无序,后者有序;在我的解法里,与顺序无关,因此都可。