一、题目描述
定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。
现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?
注意:字典中可能有重复单词。
二、输入描述
输入只有一行。 先输入字典中单词的个数n,再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k。
三、输出描述
第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。
四、解题思路
- 读取输入的字典单词个数 n;
- 创建一个 List 对象 datas,用于存储字典单词;
- 遍历输入,依次读取每个字典单词,并将其添加到 datas 列表中;
- 读取输入的单词x;
- 将单词x转换为字符数组 xs;
- 读取输入的整数k;
- 对 datas 列表进行字典序排序;
- 创建一个计数器变量 count 并初始化为0,用于统计满足条件的兄弟单词个数;
- 创建一个字符串变量 k,用于存储按字典序排序后的第k个兄弟单词;
- 遍历 datas 列表中的每个单词,对每个单词进行如下操作:
- 如果当前单词与x相同,或者长度不同,跳过当前单词;
- 将当前单词转换为字符数组 strs;
- 对 xs 和 strs 数组进行升序排序;
- 如果 strs 数组与 xs 数组不相等,跳过当前单词;
- 将 count 加1,表示找到一个满足条件的兄弟单词;
- 如果 count 等于k,将当前单词赋值给 k;
- 输出 count 表示满足条件的兄弟单词个数;
- 输出 k 表示按字典序排序后的第k个兄弟单词;
五、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int num = sc.nextInt();
List<String> datas = new ArrayList();
for (int i = 0; i < num; i++) {
datas.add(sc.next());
}
String x = sc.next();
char[] xs = x.toCharArray();//取反
int index = sc.nextInt();
Collections.sort(datas);
int count = 0;
String k = "";
for (String str : datas) {
if (x.equals(str) || x.length() != str.length()) {
continue; //字符串一样 和 长度不一样的跳过
}
char[] strs = str.toCharArray();
Arrays.sort(xs);
Arrays.sort(strs);
if (!Arrays.equals(strs, xs)) {
continue;//升序排序不相等,跳过
}
count += 1; // 满足条件的累加
if (count == index) {
k = str;//第K个兄弟单词
}
}
System.out.println(count);
System.out.println(k);
}
}
六、效果展示
🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。