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

【华为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;
        }
    }
}
时间: 2024-10-24 22:18:31

【华为OJ】【073-查找兄弟单词】的相关文章

查找兄弟单词

/****************************************************************************** Copyright (C), 2001-2012, Huawei Tech. Co., Ltd. ****************************************************************************** File Name : FindSimilarWord.cpp Version :

华为OJ平台——查找组成一个偶数最接近的两个素数

1 import java.util.Scanner; 2 3 /** 4 * 问题描述:任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况, 5 * 本题目要求输出组成指定偶数的两个素数差值最小的素数对,其中 5 < n <= 10000 6 * eg:输入20,输出7 13 7 */ 8 public class PrimePair { 9 10 public static void main(String[] args) { 11 Scanner cin = ne

华为OJ:2290 字符串最后一个单词的长度

用JAVA就很简单,只要用spilt函数,再输出最后一个字符串. 题意是要求你先自己写分隔好字符串这样子.有个比较坑的地方就是测试用例应该有个全为空的,要注意. import java.util.Scanner; public class Main { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.nextLine(); String ss[]=s.spli

华为OJ:查找输入整数二进制中1的个数

不得不说这道题就是一道十分蛋疼的题,我本来想着对输入的整数K对1按位与运算,然后再将K向右移一位,循环这样做,知道K为0. 万万没想到,程序一直超时,莫名其妙,看讨论上说是因为这编译器高位补零,还能不能再坑一点. import java.util.Scanner; public class binarySystemOneNumber { public static int findNumberOf1(int k){ int count=0; int num=1; for(int i=1;i<=I

【华为OJ】【091-数据分类处理】

[华为OJ][算法总篇章] [华为OJ][091-数据分类处理] [工程下载] 题目描述 信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码.QQ用户.手机号码.银行帐号等信息及活动记录. 采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出. 输入描述: ?一组输入整数序列I和一组规则整数序列R,I和R序列的第一个整数为序列的个数(个数不包含第一个整数):整数范围为0~0xFFFFFFFF,序列个数不限 输出描述: ?从R依次中取出R<i>,对I进行处理,找到满足条件

【华为OJ】【081-查找两个字符串a,b中的最长公共子串】

[华为OJ][算法总篇章] [华为OJ][081-查找两个字符串a,b中的最长公共子串] [工程下载] 题目描述 查找两个字符串a,b中的最长公共子串 输入描述 输入两个字符串 输出描述 返回重复出现的字符 输入例子 abcdefghijklmnop abcsafjklmnopqrstuvw 输出例子 jklmnop 算法实现 import java.util.Scanner; /** * Author: 王俊超 * Date: 2016-01-04 08:43 * Declaration: A

【华为OJ】【026-字符串加密】

[华为OJ][算法总篇章] [华为OJ][026-字符串加密] [工程下载] 题目描述 有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙.下面是它的工作原理: 首先,选择一个单词作为密匙,如TRAILBLAZERS.如果单词中包含有重复的字母,只保留第1个,其余几个丢弃. 现在,修改过的那个单词死于字母表的下面,如下所示: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z T R A I L B Z E S C D F G H J K

【华为OJ】【028-图片整理】

[华为OJ][算法总篇章] [华为OJ][028-图片整理] [工程下载] 题目描述 Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好.请大家给Lily帮忙解决. 输入描述 Lily使用的图片包括"A"到"Z"."a"到"z"."0"到"9".输入字母或数字个数不超过1024. 输出描述 Lily的所有图片按照从小到大的

华为OJ IP地址判断有效性

题目标题: 判断输入的字符串是不是一个有效的IP地址 详细描述: 请实现如下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 输出:true 有效的IP地址,false,无效的IP地址 约束 输入IP为XXX.XXX.XXX.XXX格式 字符串两端含有空格认为是合法IP 字符串中间含有空格认为是不合法IP 类似于 01.1.1.1, 1.02.3.4  IP子段以0开头为不合法IP 子段为单个0 认为是合法IP,0.0.