华为OD机试真题 Java 实现【快速人名查找】【2023 B卷 200分】,附详细解题思路

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

给一个字符串,表示用","分开的人名。

然后给定一个字符串,进行快速人名查找,符合要求的输出。

快速人名查找要求:人名的每个单词的连续前几位能组成给定字符串,一定要用到每个单词。

二、输入描述

第一行是人名,用“,”分开的人名 第二行是查找字符串。

三、输出描述

输出满足要求的人名。

四、解题思路

深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(n)。

  1. 第一行输入人名,逗号隔开;
  2. 通过java8 Stream表达式(简洁/方便/上档次)快速拆解输入行;
  3. 输入查找字符串find;
  4. 深度优先搜索算法dfs,遍历人名list;
  5. name和find开始匹配,name消耗多个find;
  6. 首字母匹配,那么直接进行下一个匹配;
  7. 输出满足要求的人名。

五、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        List<String> names = Arrays.asList(sc.nextLine().split(","));
        // 查找字符串
        String find = sc.next();
        String ret = "";
        for (String name : names) {
            List<String> list = Arrays.asList(name.split(" "));
            if (dfs(list, 0, find, 0)) {
                ret = ret.isEmpty() ? name : ret + "," + name;
            }
        }
        System.out.println(ret);
    }

    /**
     * 深度优先搜索算法dfs
     * @param list 人名集合
     * @param nameIndex 人名序号index
     * @param find 查找字符串
     * @param findIndex 查找字符串的每一个字符index
     * @return
     */
    public static boolean dfs(List<String> list, int nameIndex, String find, int findIndex) {
        // 是否搜索完毕
        if (nameIndex == list.size() || findIndex == find.length()) {
            return (nameIndex == list.size() && findIndex == find.length());
        }

        // 进行当前比较的人名
        String name = list.get(nameIndex);

        // 首字母不匹配,直接退出
        if (name.charAt(0) != find.charAt(findIndex)) {
            return false;
        }

        // name和find开始匹配,name消耗多个find
        int cnt = 1;
        while (cnt < name.length() && findIndex + cnt < find.length() && name.charAt(cnt) == find.charAt(findIndex + cnt)) {
            if (dfs(list, nameIndex + 1, find, findIndex + cnt + 1)) {
                return true;
            }
            cnt++;
        }

        // 首字母匹配,那么直接进行下一个匹配
        return dfs(list, nameIndex + 1, find, findIndex + 1);
    }
}

六、效果展示

1、输入

nezha soft,nezha soft java,nezha soso
ns

2、输出

nezha soft,nezha soso

3、说明

nezha soft,nezha soso的第一个字母和ns匹配。

华为OD机试真题 Java 实现【快速人名查找】【2023 B卷 200分】,附详细解题思路_第1张图片


下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,java,python,开发语言,程序人生,学习)