• [算法]华为笔试题——拼音与英文转换


    题目描述:

    编写拼音与英文转换的函数,如果输入号码是英文,转成拼音,如果是拼音,转成英文,例如输入OneZeroDoubleThree,则输出YiLingSanSan。

    拼音、英文见下表:

    Yi Er San Si Wu Liu Qi Ba Jiu Ling

    One Two Three Four Five Six Seven Eight Nine Zero

    注意:每个单词均为首字母大写,遇到连续两个相同数字,输入可以前面加Double,输出不可以加Double。

    输入描述:

    由首字母大写的字符串,字符输入范围是0,1,2,3,4,5,6,7,8,9的英文单词或者中文拼音。

    输出描述:

    如果输入是英文单词,输出拼音。如果输入是拼音,输出英文单词。不能混合出现,输入非法,输出ERROR。

    示例:

    输入:

    OneTwoDoubleThree

    输出:

    YiErSanSan

    思路:首先,分词,根据大写字母将字符串进行分词。然后,进行匹配和替换,着重考虑一下Double。最后,处理各种非法情况。

    代码:

    package com;
    
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Scanner;
    import java.util.Set;
    
    public class Test {
        static String[] english = {"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};
        static String[] pinyin = {"Ling", "Yi", "Er", "San", "Si", "Wu", "Liu", "Qi", "Ba", "Jiu"};
        static List<String> elist = new ArrayList<String>();
        static List<String> plist = new ArrayList<String>();
        
        static {
            for (int i = 0; i < english.length; i++) {
                elist.add(english[i]);
                plist.add(pinyin[i]);
            }
        }
        public static void main(String[] args) {
            int flag = 1;//代表正常情况,为0代表输出ERROR
            Scanner scanner = new Scanner(System.in);
            String s = scanner.nextLine();
            /**
             * 如果输入全是小写字母直接报错
             */
            if(s.matches("[a-z]{1,}")){
                flag = 0;
            }
            String s1 = s.replaceAll("[A-Z]", " $0");// 正则替换注意“ $0”前面有个空格
            String[] split = s1.split(" ");
            String[] split2 = new String[split.length - 1];
            System.arraycopy(split, 1, split2, 0, split2.length);//因为split切分完多出了一个空的字符(首位),现在把它去掉
            
            try {
                for (int i = 0; i < split2.length; i++) {
                    if(elist.contains(split2[i])){
                        int index = elist.indexOf(split2[i]);
                        split2[i] = split2[i].replace(split2[i], plist.get(index));
                    }else if(plist.contains(split2[i])){
                        int index = plist.indexOf(split2[i]);
                        split2[i] = split2[i].replace(split2[i], elist.get(index));
                    }else if (split2[i].equals("Double")) {
                        split2[i] = split2[i + 1];
                        if(elist.contains(split2[i])){
                            int index = elist.indexOf(split2[i]);
                            split2[i] = split2[i].replace(split2[i], plist.get(index));
                        }else if(plist.contains(split2[i])){
                            int index = plist.indexOf(split2[i]);
                            split2[i] = split2[i].replace(split2[i], elist.get(index));
                        }else{
                            /**
                             * 出现DoubleDouble的情况
                             */
                            flag = 0;
                        }
                    }else{
                        flag = 0;
                    }
                }
            } catch (Exception e) {
                /**
                 * 抛出异常是因为有一种只出现Double的情况
                 */
                flag = 0;
            }
            
            /**
             * 这里通过set的个数进行判断,因为最后只能出现要么都是英语,要么都是拼音,两者一旦混合出现就不对了
             */
            Set<Integer> set = new HashSet<Integer>();
            for (int i = 0; i < split2.length; i++) {
                set.add(judge(split2[i]));
            }
            
            if(set.size() > 1){
                flag = 0;
            }
            
            StringBuilder sb = new StringBuilder("");
            if(flag == 1){
                for (int j = 0; j < split2.length; j++) {
                    sb.append(split2[j]);
                }
            }else{
                sb.append("ERROR");
            }
            System.out.println(sb.toString());
        }
        
        /**
         * 判断一个字符串是属于英语数字还是拼音数字还是什么也不是
         * @param string
         * @return 英语数字返回0,拼音数字返回1,否则返回-1
         */
        public static int judge(String string){
            int ret = -1;
            if(elist.contains(string)){
                ret = 0;
            }else if(elist.contains(string)){
                ret = 1;
            }
            return ret;
        }
    }
    正则表达式中$1,$2...是表示的小括号里的内容 $1是第一个小括号里的 ,$2是第2个小括号里的 比如 /gai([w]+?)over([d]+)/ 匹配 gainover123 $1= 括号里的 n $2= 第2个括号里的 123,$0表示所有。
  • 相关阅读:
    学习进度报告2021/4/5
    学习进度报告2021/4/4
    学习进度报告2021/4/3
    学习进度报告2021/4/2
    学习进度报告2021/4/1
    学习进度报告2021/3/31
    《学会提问》读书笔记3
    学习进度报告2021/3/30
    MySQL入门——如何进行主从配置
    MySQL入门详解——事务、锁、优化
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/7457186.html
Copyright © 2020-2023  润新知