2014.9.23 創新工場 北航站 筆試題,有個電話號碼對應英文字母組合的題。當時沒寫出來,後在《編程之美》上也看到這題:電話的號碼盤一般可以用於輸入字母。如用2可以輸入A、B、C,用3可以數D、E、F等。如下表所示:
1 |
2 ABC |
3 DEF |
4 GIH |
5 JKL |
6 MNO |
7 PQRS |
8 TUV |
9 WXYZ |
0 |
對於號碼5869872,可以依次輸出其代表的所有字母組合。如:JTMWTPA、JTMWTPB。。。。。。
有兩個解法,1是直接循環法,2是遞歸的方法。以下是Java實現的代碼,完全是書上的思路:
package algorithm;
public class Num2Letter {
private static char c[][] = {
{}, //0
{}, //1
{'A','B','C'}, //2
{'D','D','E'}, //3
{'G','H','I'}, //4
{'J','K','L'}, //5
{'M','N','O'}, //6
{'P','Q','R','S'}, //7
{'T','U','V'}, //8
{'W','X','Y','Z'} //9
};
private static int total[] = {0, 0, 3, 3, 3, 3, 3, 4, 3, 4}; //各個數字所能代表的字符總數
//int number[]; //存儲電話號碼的數組
//int answer[]; //數字目前所代表的字符在其所能代表的字符集中的位置
//int TelLength = 0;
public static void PrintResult(String telNumber){
int TelLength = telNumber.length();
int[] number=new int[TelLength];
int[] answer=new int[TelLength];
for(int i=0; i<TelLength; i++){
number[i]=telNumber.charAt(i)-'0';
answer[i]=0;
}
//DirectSearch(number,answer, TelLength);
RecursiveSearch(number, answer, 0, TelLength);
}
private static void DirectSearch(int[] number, int[] answer, int TelLength){ //解法一、直接循環法
while(true){
for(int i=0; i<TelLength; i++){
System.out.print(c[number[i]][answer[i]]);
}
System.out.println("");
int k=TelLength-1;
while(k>=0){
if(answer[k]<total[number[k]]-1){
answer[k]++;
break;
}else{
answer[k]=0;
k--;
}
}
if(k<0)
break;
}
}
private static void RecursiveSearch(int[] number, int[] answer, int index, int TelLength){ //解法二、遞歸的方法
if(index == TelLength){
for(int i=0; i<TelLength; i++){
System.out.print(c[number[i]][answer[i]]);
}
System.out.println("");
return;
}
for(answer[index]=0; answer[index]<total[number[index]]; answer[index]++){
RecursiveSearch(number, answer, index+1, TelLength);
}
}
public static void main(String args[]){
String phoneNum="5869872";
Num2Letter.PrintResult(phoneNum);
}
}
輸出結果爲;
JTMWTPA
JTMWTPB
JTMWTPC
JTMWTQA
JTMWTQB
JTMWTQC
JTMWTRA
JTMWTRB
JTMWTRC
JTMWTSA
JTMWTSB
JTMWTSC
JTMWUPA
......