华为机考HJ27题解 | #查找兄弟单词#
查找兄弟单词
https://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] w = in.nextLine().split(" ");
int n=Integer.parseInt(w[0]);
String x=w[w.length-2];//注意最好用长度
int index=Integer.parseInt(w[w.length-1]);//
List<String> lips=new ArrayList<>();
for(int i=1;i<=n;i++){//注意小于n
if(matchX(w[i],x)){//如果匹配
lips.add(w[i]);
}
}
System.out.println(lips.size());
if(lips.size()>=index){//注意题目隐晦的告知要按顺序的第k个
Collections.sort(lips);
System.out.println(lips.get(index-1));
}
}
private static boolean matchX(String a,String x){
//获取x的长度
int xLen=x.length();
//长度
if(a.length()!=xLen||a.equals(x)){
return false;
}
char[] ach=a.toCharArray();
char[] xch=x.toCharArray();
Arrays.sort(ach);
Arrays.sort(xch);
return new String(ach).equals(new String(xch));
}
}
题目描述
定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。
现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?
注意:字典中可能有重复单词。
数据范围:
1≤𝑛≤1000 1≤n≤1000
,输入的字符串长度满足
1≤𝑙𝑒𝑛(𝑠𝑡𝑟)≤10 1≤len(str)≤10
,
1≤𝑘<𝑛 1≤k<n
输入描述:
输入只有一行。 先输入字典中单词的个数n,再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k
输出描述:
第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。
示例1
输入:
3 abc bca cab abc 1
输出:
2 bca
示例2
输入:
6 cab ad abcd cba abc bca abc 1
输出:
3 bca
说明:
abc的兄弟单词有cab cba bca,所以输出3 经字典序排列后,变为bca cab cba,所以第1个字典序兄弟单词为bca
解题要点:
1 数组的index尽可能用size-n处理,避免越界问题
2 题目隐晦的提示了 需要将兄弟队列进行排序
3 两个字符串是否含有相同元素可以通过重组比较进行确认
查看28道真题和解析
