【华为OJ】【073-查找兄弟单词】

105 篇文章 155 订阅

【华为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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值