华为上机练习题--将英文号码翻译成数字号码

题目:

 * 将 电话号码 one two 。。。nine zero 翻译成1  2 。。9 0
 *
 * 中间会有double
 *
 * 例如
 *     输入:OneTwoThree
 *     输出:123
 *     输入:OneTwoDoubleTwo
 *     输出:1222
 *     输入:1Two2
 *     输出:ERROR
 *     输入:DoubleDoubleTwo
 *     输出:ERROR


分析:对于字符串的操作有一个比较好用的方法就是replaceAll(),有了这个方法我们可以轻松的将英文翻译成数字, 剩下的事就是判断非法的问题,这个可以使用正则表达式,不过请原谅楼主渣渣的正则表达式(之后楼主一定会狠狠的恶补正则表达式的), 万谢!


代码如下:

package com.wenj.test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author wenj91-PC
 *
 */

public class TestTranslateTelNum {

    public static void main(String args[]) {
        String strIn = "OneTwoDoubleTwo";
        TestTranslateTelNum tt = new TestTranslateTelNum();
        System.out.println(tt.translateTelNum(strIn));
    }

    public String translateTelNum(String strIn){
        String strTemp = strIn;
        String[] strArr = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Zero", "Double"};
        String[] strNum = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "#"};
        
        Pattern p = Pattern.compile("\\DoubleDouble|\\d|\\p{Punct}");//如果存在双double/[0-9]/其他字符则直接返回ERROR
        Matcher m = p.matcher(strTemp);
        if(m.find()){
            return "ERROR";
        }
        
        for(int i=0; i<strArr.length; i++){
            strTemp = strTemp.replaceAll(strArr[i], strNum[i]);
        }
        
        char[] sC = strTemp.toCharArray();//这是后来添加的,修正之前存在的问题
        for(int i=0; i<sC.length; i++){
            if('#' == sC[i]){
                if(i == sC.length-1)    //如果double处于末尾位置说明也是错误的
                    return "ERROR";
                sC[i] = sC[i+1];          //将double换成double所修饰的数
            }
        }
        strTemp = "";//这里建议用StringBuffer
        for(int i=0; i<sC.length; i++){
            strTemp+=sC[i];
        }
    
        p = Pattern.compile("[a-zA-Z]");//如果还存在[a-zA-Z]说明输入的时候有误,还是返回ERROR
        m = p.matcher(strTemp);
        if(m.find()){
            System.out.println(strTemp);
            return "ERROR";
        }
        
        return strTemp;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值