面试题06:一串英文数字转换成阿拉伯数字

已知:zero,one,two,three,four,five,six,seven,eight,nine分别对应0,1,2,3,4,5,6,7,8,9,对每一段含有这几种字符串的字符串进行转换,如:
输入:nineeightsevensixfivefourthreetwoonezero
输出:9876543210
数字的先后顺序不考虑。
代码:

public static String englishToNumber(String arr){
        Map map = new HashMap();
        map.put("zero", "0");
        map.put("one", "1");
        map.put("two", "2");
        map.put("three", "3");
        map.put("four", "4");
        map.put("five", "5");
        map.put("six", "6");
        map.put("seven", "7");
        map.put("eight", "8");
        map.put("nine", "9");
        String message = "";

        while(!"".equals(arr)){
        if (arr.startsWith("on") || arr.startsWith("tw") || arr.startsWith("si")) {
            message += map.get(arr.substring(0, 3));
            arr = arr.substring(3,arr.length());
        }
        if (arr.startsWith("ze") || arr.startsWith("fo") || arr.startsWith("fi") || arr.startsWith("ni")){
            message += map.get(arr.substring(0, 4));
            arr = arr.substring(4,arr.length());
        }
        if (arr.startsWith("th") || arr.startsWith("se") || arr.startsWith("ei")) {
            message += map.get(arr.substring(0, 5));
            arr = arr.substring(5,arr.length());
        }
    }
        return message;
    }

    @Test
    public void test(){
        assert("1230".equals(One.englishToNumber("onetwothreezero")));
        assert("5684".equals(One.englishToNumber("fivesixeightfour")));
        assert("158465".equals(One.englishToNumber("onefiveeightfoursixfive")));
    }

首先,先写了一个单元测试,然后来写具体的实现。具体的思路是把三个英文字母的,四个英文字母的和五个英文字母的分成三组。每一组里面处理字符串的方式(截取字符串的长度)是一样的,然后从Map中取出Value。使用到while循环,当目标字符串为空时不循环。
值得注意的是,这种比较笨的处理方式也有其局限性,当目标字符串较长时,while的执行体(即三个if的判断)内部的先后顺序会影响到执行的效果,最好的情况是三个if判断依次为TRUE,最坏的情况是每次都是最后一个if为TRUE。总而言这这个解答相当普通,暂时没有比较好的解法。

程序中出现的错误主要包含两点
a.用==来比较字符串是否相等,应该有equals()等方法
b.对subString(a,b)的使用容易引发数组越界的异常

你可能感兴趣的:(面试)