华为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
,看明白了吗?
理解题意之后就简单了。
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++;
}
}
}
}
nezha nezh nez nez ne n study stud stu stu st s s java ja ja j
study
下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。