题解 | #查找兄弟单词#
查找兄弟单词
http://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68
我这个思路比较好理解,代码实现也不复杂,只能想到这个方法了
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str;
while ((str = bf.readLine()) != null){
int len = str.length();
int n = Integer.parseInt(String.valueOf(str.charAt(0)));
int k = Integer.parseInt(String.valueOf(str.charAt(len - 1)));
//将所有单词放到一个String数组中
String[] dictionary = str.substring(2, len - 2).split(" ");
//单词X所在的下标,没啥用,下面多次用到,减少时间复杂度
int j = dictionary.length - 1;
//将单词X转为char数组,然后按字母表排序
char[] word = dictionary[j].toCharArray();
Arrays.sort(word);
//ArrayList用于存放兄弟单词
ArrayList<String> characters = new ArrayList<>(n);
for (int i = 0; i < j; i++) {
//先排除长度不一样和未排序前相等的单词
if (dictionary[i].length() == dictionary[j].length() && !dictionary[i].equals(dictionary[j])){
//剩下只有交换位置后可能是兄弟单词的单词,然后将单词排序后若相等则为兄弟单词(本来就是交换位置所得,都按字母表排序相等就是兄弟单词)
char[] temp = dictionary[i].toCharArray();
Arrays.sort(temp);
if (Arrays.equals(temp, word)){
characters.add(dictionary[i]);
}
}
}
System.out.println(characters.size());
Collections.sort(characters);
if (k > 0 && k <= characters.size()){
System.out.println(characters.get(k - 1));
}
}
}
}
查看9道真题和解析