標籤:java 華為 演算法 解決方案
題目:
* 將 電話號碼 one two 。。。nine zero 翻譯成1 2 。。9 0
*
* 中間會有double
*
* 例如
* 輸入:OneTwoThree
* 輸出:123
* 輸入:OneTwoDoubleTwo
* 輸出:1222
* 輸入:1Two2
* 輸出:ERROR
* 輸入:DoubleDoubleTwo
* 輸出:ERROR
分析:對於字串的操作有一個比較好用的方法就是replaceAll(),有了這個方法我們可以輕鬆的將英文翻譯成數字, 剩下的事就是判斷非法的問題,這個可以使用Regex,不過請原諒樓主渣渣的Regex(之後樓主一定會狠狠的惡補Regex的), 萬謝!
代碼如下:
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;
}
}