华为OD机试 - 真正的密码 - 数据结构list(Java 2023 B卷 100分)

在这里插入图片描述

目录

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

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

专栏导读

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

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

一、题目描述

一行中输入一个字符串数组,如果其中一个字符串的所有以索引0开头的子串在数组中都有,那么这个字符串就是潜在密码。

在所有潜在密码中最长的是真正的密码,如果有多个长度相同的真正的密码,那么取字典序最大的为唯一的真正的密码,求唯一的真正的密码。

二、输入描述

一个字符串,字符之间用空格隔开。

三、输出描述

真正的那个密码字符串。

输入 输出 说明
h he hel hell hello o ok n ni nin ninj ninja ninja 按要求,hello、ok、ninja都是潜在密码。
检查长度,hello、ninja是真正的密码。
检查字典序,ninja是唯一真正密码。
a b c d f f 按要求,a b c d f 都是潜在密码。
检查长度,a b c d f 是真正的密码。
检查字典序,f是唯一真正密码。

四、解题思路

本题的关键是如何理解题意。

一行中输入一个字符串数组,如果其中一个字符串的所有以索引0开头的子串在数组中都有,那么这个字符串就是潜在密码

简单点说,就是这个字符串的前几位子字符串,在数组中都要存在。

比如上面的例子:n ni nin ninj ninja | ninja,看明白了吗?

理解题意之后就简单了。

具体解题思路:

  1. 去重;
  2. 先按长度降序排序,再按字典表排序;
  3. 遍历排序后的list;
  4. 核心思想:按照顺序依次比较,按要求全部匹配的,即为真正的密码字符串;
  5. 利用list.contains方法进行判断,全都包含的,第一次匹配的,就是真正的密码字符串;

五、Java算法源码

package com.guor.od;

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

public class OdTest02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 去重
        List<String> list = Arrays.asList(scanner.nextLine().split(" ")).stream().distinct().collect(Collectors.toList());

        // 先按长度降序排序,再按字典表排序
        list.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                // 按长度降序排序
                if (o1.length() > o2.length()) {
                    return -1;
                } else if (o1.length() < o2.length()) {
                    return 1;
                } else {
                    // 按字典表排序
                    for (int i = 0; i < o1.length(); i++) {
                        if (o1.charAt(i) > o2.charAt(i)) {
                            return -1;
                        } else if (o1.charAt(i) < o2.charAt(i)) {
                            return 1;
                        }
                    }
                    return 0;
                }
            }
        });

        // 排序后
        System.out.println(list);
        for (String word : list) {
            int right = 1;
            // 核心思想:按照顺序依次比较,按要求全部匹配的,即为真正的密码字符串
            while (list.contains(word.substring(0, right))) {
                // 第一次匹配的,就是真正的密码字符串
                if (right == word.length()) {
                    System.out.println(word);
                    return;
                }
                right++;
            }
        }
    }
}

六、效果展示

1、输入

nezha nezh nez nez ne n study stud stu stu st s s java ja ja j

2、输出

study

华为OD机试 - 真正的密码 - 数据结构list(Java 2023 B卷 100分)_第1张图片


下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

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

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

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,数据结构,java)