华为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-查找兄弟单词的主要内容,如果未能解决你的问题,请参考以下文章

华为python机试题目:查找兄弟单词称砝码单词倒排购物单合并表记录

华为OJ机试训练

[华为OJ--C++]001-字符串最后一个单词的长度

华为huawei oj

查找兄弟单词

华为OJ079-查找组成一个偶数最接近的两个素数