電話號碼對應英文字母組合

    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
......
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章