CCF 202305-1 Java版题解

先上题目 🌺


题目出处: 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都可以,区别是前者存放无序,后者有序;在我的解法里,与顺序无关,因此都可。


AC图

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nanged

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值