面试题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<String,String> map = new HashMap<String,String>();
        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)的使用容易引发数组越界的异常

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值