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

题目描述:

编写拼音与英文转换的函数,如果输入号码是英文,转成拼音,如果是拼音,转成英文,例如输入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表示所有。
时间: 2024-11-03 21:03:10

[算法]华为笔试题——拼音与英文转换的相关文章

删数字 -- 2016华为笔试题

题目: 有一个整型数组a[n]顺序存放0 ~ n-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置. 以 8 个数(n=8)为例:{0,1,2,3,4,5,6,7}, 0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除. 思路: 这题有3种解法, 第一种就是构建循环链表模拟删数字的过程,但是时间空间复杂度较高, 第二种是用LinkedList模拟删数字过程,相较

数据结构与算法常见笔试题

一.算法的基本概念计算机解题的过程实际上是在实施某种算法,这种算法称为计算机算法.1.算法的基本特征:可行性,确定性,有穷性,拥有足够的情报.2.算法的基本要素:算法中对数据的运算和操作.算法的控制结构.3.算法设计的基本方法:列举法.归纳法.递推.递归.减半递推技术.回溯法.4.算法设计的要求:正确性.可读性.健壮性.效率与低存储量需求二.算法的复杂度1.算法的时间复杂度:指执行算法所需要的计算工作量2.算法的空间复杂度:执行这个算法所需要的内存空间三.数据结构的定义1.数据的逻辑结构:反映数

删数字(华为笔试题)

Be4m83寿qyo履谡4http://www.docin.com/app/user/userinfo?userid=179253696 cp那8泌qg捣腿6sihttp://www.facebolw.com/space/2103619/follower 3傅2派O9捣枪幼2赝http://jz.docin.com/hfzi26050 甲4n97FVL焙9侗Xhttp://shequ.docin.com/rurf998 j8f3HX识9县Jhttp://shufang.docin.com/thf

华为笔试题 合唱队

题目描述 计算最少出列多少位同学,使得剩下的同学排成合唱队形 说明: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,   则他们的身高满足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>......>TK. 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,

[算法]滴滴笔试题——赛马问题

问: 25匹马,5个跑道,每个跑道最多能有1匹马进行比赛,最少比多少次能比出前3名? 答: 求前3名要7次: 将马分成A.B.C.D.E五组. 第1-5次比赛:各组分别进行比赛,决出各组名次,取每组前三名 A1.A2.A3, B1.B2.B3, C1.C2.C3, D1.D2.D3, E1.E2.E3. 第6次比赛:A1.B1.C1.D1.E1, 假设得到的结果是A1.B1.C1.D1.E1,A1是跑的最快的,那么分析A组A2.A3还有希望冲进前3,B组呢?只有B2还有希望冲进前3,C组的C1,

[算法]滴滴笔试题——求最大子串和(O(n)复杂度)

扫描法.一次扫描数组即可得出答案,复杂度O(n).这种方法用文字描述不容易说清楚,下面用每一步运算的图示来表达.伪代码如下: maxsofar=end=0; for i=[0,n) end=max(end+x[i],0) maxsofar=max(maxsofar,end) 即使后面没有这样的值了,maxsofar中还保存了原来的最大和,有恃无恐.这里的一条重要原则是目前end的值必须>0,如果<0,则不用考虑,立刻放弃end目前的值,将它置为0,并且把end的指针指向58. 以此类推下去,最

2018华为笔试题

题目描述 给定一个整数,给出消除重复数字以后最大的整数 输入描述: 正整数,注意考虑长整数 输出描述 消除重复数字后的最大整数 示例1 输入 423234 输出 432 思路分析 :要保存原来的顺序这个题目才有意思,如果不保存原来的顺序,那直接一个set就搞定了. 很明显这个数字的最大长度不会超过20.怎么暴力都可以了... 思路就是贪心的放每一位ie数字, 比如423234 我们放完第一个4 再放2的时候直接放入,再放3的时候发现前面的2比3小,而且2还有一个剩余,那么我们就用3替换2,一次类

经典算法——堆排序笔试题

阿里巴巴2016研发工程师笔试选择题 1.将整数数组(7-6-3-5-4-1-2)按照堆排序的方式原地进行升序排列,请问在第一轮排序结束之后,数组的顺序是_____.

2018摩拜算法工程师笔试题

一.字符串变形 输入两个字符串a和b,a的长度小于b的长度.现在可以在a中的每个位置插入任意字符,使得最终a的长度等于b的长度,问最后a和b中对应位置字符不同的位置的个数. 这个问题可以看做是:带约束的最长公共子序列 考虑形如abcx 和ayybc的两个字符串,第一个字符串不能添加太多字符,否则会导致它的长度太长.当a[i]=b[j]时,i必须不能大于j,否则a[i]是不可能等于j的. 这道题测试样例过于简单,以至于很多错误解法也能全部通过. import java.util.Scanner;