【华为机考E卷】-“猜字谜”题解思路java

算法每一题,成长每一天~

C0E6 猜字谜

真题链接:【持续更新】2024华为 OD 机试E卷 机考真题库清单(全真题库)

思路

题干依然是不太清晰。比如 woood 和 wodo 去重后算一致吗?去重与重排序能同时满足还是只能分别满足?(先按简单方式做!万一测例通过了呢
在这里插入图片描述

Java

下面是能同时满足两个条件的代码实现:


import java.util.*;
import java.util.stream.Collectors;

/**
 * 猜字谜
 */
public class C0E6 {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        String[] mStrings = in.nextLine().split(",");
        String[] dStrings = in.nextLine().split(",");

        // 处理谜面
        Set<String> mSet = convert(mStrings, null);

        // 处理谜底(最后要打印谜底,所以谜底需要保留映射)
        Map<String, String> dMap =new HashMap<>();
        Set<String> dSet = convert(dStrings, dMap);

        mSet.retainAll(dSet); // 保留存在的元素

        String print = mSet.stream()
                           .map(dMap::get) // 转称谜底打印
                           .collect(Collectors.joining(","));
        System.out.println(print);
    }

    public static Set<String> convert(String[] mStrings, Map<String, String> map) {
        Set<String> mList = new HashSet<>(mStrings.length);
        for (String str : mStrings) {
            if (str.isEmpty()) {
                continue;
            }
            // 字符串去重排序
            TreeSet<String> treeSet =
                    new TreeSet<>(Arrays.asList(str.split("")));
            // 组成新字符串
            String trim = String.join("", treeSet).trim();
            mList.add(trim);

            if (map != null) {
                map.put(trim, str); // 记录谜底原字符串 与新字符串 的映射关系
            }
        }

        return mList;
    }
}

总结

1、题目不清楚时,先按思路清晰的简单的方式做。特别是另一种情况一时想不清楚时!
2、TreeSet 用于去重+排序
3、retainAll() 是个好方法,区别于 removeAll()。

xx:只能分别满足其一的情况,暂时没想到,题干也不清晰.:去重是只能连续的去重,还是任意位置去重?比如 woood和 wodooo,去重后是一样的吗?就这样吧~


算法要多练多练多练!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值