华为OJ073-查找兄弟单词
Posted Wang-Junchao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为OJ073-查找兄弟单词相关的知识,希望对你有一定的参考价值。
【华为OJ】【算法总篇章】
【华为OJ】【073-查找兄弟单词】
【工程下载】
题目描述
输入描述
先输入字典中单词的个数,再输入n个单词作为字典单词。
输入一个单词,查找其在字典中兄弟单词的个数
再输入数字n
输出描述
根据输入,输出查找到的兄弟单词的个数
输入例子
3
abc
bca
cab
abc
1
输出例子
2
bca
算法实现
import java.util.*;
/**
* Author: 王俊超
* Date: 2016-01-05 14:49
* All Rights Reserved !!!
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
Map<Key, List<String>> map = new HashMap<>();
while (scanner.hasNext()) {
map.clear();
int n = scanner.nextInt();
// 构造一个字典
while ((--n) >= 0) {
String s = scanner.next();
Key k = new Key(s);
if (map.containsKey(k)) {
map.get(k).add(s);
} else {
List<String> list = new ArrayList<>();
list.add(s);
map.put(k, list);
}
}
//
String s = scanner.next();
// s的第i个兄弟节点
int i = scanner.nextInt();
Key k = new Key(s);
List<String> list = map.get(k);
if (list != null) {
Collections.sort(list);
// 删除s
while (list.contains(s)) {
list.remove(s);
}
System.out.println(list.size());
int cnt = 0;
Iterator<String> itr = list.iterator();
String t = "";
while (cnt < i && itr.hasNext()) {
t = itr.next();
if (!t.equals(s)) {
cnt++;
if (cnt == i) {
System.out.println(t);
}
}
}
}else {
System.out.println(0);
}
}
scanner.close();
}
private static class Key {
private String s;
private String t;
private int hashCode;
public Key(String s) {
this.s = s;
if (s == null) {
hashCode = 0;
} else {
char[] chars = s.toCharArray();
Arrays.sort(chars);
t = new String(chars);
hashCode = t.hashCode();
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Key key = (Key) o;
return t != null ? t.equals(key.t) : key.t == null;
}
@Override
public int hashCode() {
return hashCode;
}
}
}
以上是关于华为OJ073-查找兄弟单词的主要内容,如果未能解决你的问题,请参考以下文章