题目:
* 将 电话号码 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;
}
}
华为上机练习题--将英文号码翻译成数字号码