华为OD机试 - 英文输入法 - 逻辑分析(Java 2023 B卷 100分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
      • 1、需求如下:
      • 2、注意:
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明
      • 4、区分大小写,如果联想不到,输出前缀

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

专栏导读

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

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

一、题目描述

主管期望你来实现英文输入法单词联想功能。

1、需求如下:

依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词,按字典序输出联想到的单词序列,如果联想不到,请输出用户输入的单词前缀。

2、注意:

  1. 英文单词联想时,区分大小写;
  2. 缩略形式如”don’t”,判定为两个单词,”don”和”t”;
  3. 输出的单词序列,不能有重复单词,且只能是英文单词,不能有标点符号。

二、输入描述

  1. 首行输入一段由英文单词word和标点符号组成的语句str;
  2. 接下来一行为一个英文单词前缀pre。

0 < word.length() <= 20
0 < str.length <= 10000
0 < pre <= 20

三、输出描述

输出符合要求的单词序列或单词前缀,存在多个时,单词之间以单个空格分割。

四、解题思路

这道题很简单,就是题述有点复杂,多读几遍,理解透彻就好办了。

  1. 首行输入一段由英文单词word和标点符号组成的语句str;
  2. 第二行输入英文单词前缀pre;
  3. 去掉连续空格、将非字母、’、空格的所有数字、字符去掉;
  4. 按空格拆分,加载到集合list中;
  5. 定义匹配的单词集合matchList;
  6. 遍历集合list;
    • 如果是特殊字符串(包含’),将其进行拆分成多个字符串;
      • 根据’进行拆分;
      • 再进行前缀匹配;
    • 否则获取匹配的单词;
  7. 按字典表排序;
  8. 如果联想不到,请输出用户输入的单词前缀;
  9. 输出符合要求的单词序列或单词前缀,存在多个时,单词之间以单个空格分割。

五、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest02 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 首行输入一段由英文单词word和标点符号组成的语句str
        String words = scanner.nextLine();
        // 英文单词前缀pre
        String pre = scanner.nextLine();

        words = words.replaceAll("\\s+", " ")// 去掉连续空格
                .replaceAll("[^A-Za-z’ ]", "")//将非字母、’、空格的所有数字、字符去掉
                .replaceAll("\\s+", " ");// 再次去掉因为某种原因产生的连续空格
        System.out.println(words);
        // 按空格拆分
        List<String> list = Arrays.asList(words.split(" "));
        // 匹配的单词集合
        ArrayList<String> matchList = new ArrayList<>();
        String special = "’";
        for (String word : list) {
            // 如果是特殊字符串(包含’),将其进行拆分成多个字符串
            if(word.contains(special)){
                String[] splitArr = word.split(special);
                for (String s : splitArr) {
                    // 匹配的单词
                    if(s.startsWith(pre)){
                        matchList.add(s);
                    }
                }
            }else {
                // 匹配的单词
                if(word.startsWith(pre)){
                    matchList.add(word);
                }
            }
        }

        // 匹配的单词
        System.out.println(matchList);

        // 按字典表排序
        Collections.sort(matchList, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return s1.compareTo(s2);
            }
        });

        // 如果联想不到,请输出用户输入的单词前缀
        if(matchList.size() == 0){
            System.out.println(pre);
            return;
        }

        StringBuilder builder = new StringBuilder();
        // 输出符合要求的单词序列或单词前缀,存在多个时,单词之间以单个空格分割
        for(int i=0;i<matchList.size()-1;i++){
            builder.append(matchList.get(i)).append(" ");
        }
        builder.append(matchList.get(matchList.size()-1));
        System.out.println(builder);
    }
}

六、效果展示

1、输入

Nezha loves learning Java、J2’ee, 666 //Don’t ‘JJ JIS J’ believe 。、in Nezha。
J

2、输出

J JIS JJ JavaJee

3、说明

  1. 输入字符串Nezha loves learning Java、J2’ee, 666 //Don’t ‘JJ JIS J’ believe 。、in Nezha。
  2. 去掉连续空格 + 将非字母、’、空格的所有数字、字符去掉,变为Nezha loves learning JavaJee Don’t JJ JIS J’ believe in Nezha
  3. 获取匹配前缀的字符串,JavaJee, JJ, JIS, J
  4. 按字典表排序,并空格分隔输出,J JIS JJ JavaJee。

华为OD机试 - 英文输入法 - 逻辑分析(Java 2023 B卷 100分)_第1张图片

4、区分大小写,如果联想不到,输出前缀

华为OD机试 - 英文输入法 - 逻辑分析(Java 2023 B卷 100分)_第2张图片


下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

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

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

在这里插入图片描述

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