判斷電話號碼對應字母組合數
阿新 • • 發佈:2018-12-22
電話號碼對應的字元組合:在電話或者手機上,一個數字如2對應著字母ABC,7對應著PQRS。那麼數字串27所對應的字元的可能組合就有3*4=12種,現在輸入一個3到11位長的電話號碼,請打印出這個電話號碼所對應的字元的所有可能組合和組合數。
(1):題目分析
首先構造一個map集合,電話號碼對應的key 值為對應的字母陣列,0和1對應對應本身。利用遞迴的思想,傳入電話號碼,取出第一個的電話號,從map集合找出對應的字母陣列,for迴圈字母陣列,比如取取出字母陣列第一個字母,加入到nu字串,然後判斷電話號碼是否還有下一位,如果有那就遞迴的拿出下一位電話號碼,迴圈遍歷電話號碼對應的字母陣列,當沒有下一位電話號碼時列印輸出nu。
(2)演算法構造:
構造map集合對映:
HashMap<Integer, String[]> map=new HashMap<Integer,String[]>();//建一個hashmap容器,將電話號碼與字母鍵值對關係建立起來 map.put(2,new String[]{"A","B","C"}); map.put(3,new String[]{"D","E","F"}); map.put(4,new String[]{"G","H","I"}); map.put(5,new String[]{"J","K","L"}); map.put(6,new String[]{"M","N","O"}); map.put(7,new String[]{"P","Q","R","S"}); map.put(8,new String[]{"T","U","V"}); map.put(9,new String[]{"W","X","Y","Z"}); map.put(1,new String[]{"1"}); map.put(0,new String[]{"0"});
遞迴體:
String key=num.charAt(j++)+"";//利用j依次取出電話號碼中的單個字元
String mu=nu;//區域性變數,利用mu記錄下每層對應的字串組合
String[] ob=(String[]) map.get(Integer.parseInt(key));//從map集合中取出單個電話字元對應的字母陣列ob
for(int i=0;i<ob.length;i++){//for迴圈遍歷ob陣列
nu=(nu+ob[i]).trim();
遞迴出口:
J>=num.length():
即就是當到最後一個電話字元的時候遞迴結束
(3):函式實現(詳細在原始碼以及註釋中加以體現)
public int count(String num,HashMap map,int j){
String key=num.charAt(j++)+"";//利用j依次取出電話號碼中的單個字元
String mu=nu;//區域性變數,利用mu記錄下每層對應的字串組合
String[] ob=(String[]) map.get(Integer.parseInt(key));//從map集合中取出單個電話字元對應的字母陣列ob
for(int i=0;i<ob.length;i++){//for迴圈遍歷ob陣列
nu=(nu+ob[i]).trim();// 依次去除ob陣列中的字母,與nu字串組合,合併。
if(j<(num.length())){//如果還有下一個電話號碼,則遞迴呼叫count
count(num,map,j);
nu=mu;//遞迴返回後,將每層對應的字串組合mu複製給nu
}else{
System.out.println(nu);//如果沒有下一位電話號碼那就列印輸出
counts++;//組合數+1
nu=mu;//遞迴返回後,將每層對應的字串組合mu複製給nu
}
}
return counts; //返回組合數
}
(4)測試結果
原始碼
import java.util.HashMap;
import java.util.Scanner;
/**
*
* @類描述:電話號碼對應的字元組合:在電話或者手機上,
* 一個數字如2對應著字母ABC,7對應著PQRS。
* 那麼數字串27所對應的字元的可能組合就有3*4=12種
* (如AP,BR等)。現在輸入一個3到11位長的電話號碼,
* 請打印出這個電話號碼所對應的字元的所有可能組合和組合數。
* @類名稱:PhoneNumber
* @建立人:司志傑
* @建立時間:2018年11月18日下午1:42:33
* @修改人:司志傑
* @修改時間:2018年11月18日下午1:42:33
* @修改備註:
* @version v1.1
* @mail [email protected]
*/
public class PhoneNumber {
public static int counts=0;//組合數
public static String nu="";// 全域性變數nu,目的記錄字串組合
public static void main(String srgs[]) {
HashMap<Integer, String[]> map=new HashMap<Integer,String[]>();//建一個hashmap容器,將電話號碼與字母鍵值對關係建立起來
map.put(2,new String[]{"A","B","C"});
map.put(3,new String[]{"D","E","F"});
map.put(4,new String[]{"G","H","I"});
map.put(5,new String[]{"J","K","L"});
map.put(6,new String[]{"M","N","O"});
map.put(7,new String[]{"P","Q","R","S"});
map.put(8,new String[]{"T","U","V"});
map.put(9,new String[]{"W","X","Y","Z"});
map.put(1,new String[]{"1"});
map.put(0,new String[]{"0"});
Scanner sca=new Scanner(System.in);//例項化Scanner類 從鍵盤接收輸入
System.out.println("請輸入電話號碼");
String num=sca.nextLine();
int j=0;// 記錄鍵盤輸入類的電話號碼的字元下標
if(num.length()>=3&&num.length()<=11){//判斷電話號碼的長度是否符合題目標準
new PhoneNumber().count(num, map, j);//呼叫count方法,計算組合數,並列印每個組合
System.out.println("共有"+counts+"個組合");// 列印組合數目
}
}
/**
* @描述:首先構造一個map集合,電話號碼對應的key 值為對應的字母陣列,0和1對應對應本身。
利用遞迴的思想,傳入電話號碼,取出第一個的電話號,
從map集合找出對應的字母陣列,for迴圈字母陣列,
比如取取出字母陣列第一個字母,加入到nu字串,
然後判斷電話號碼是否還有下一位,如果有那就遞迴的拿出下一位電話號碼,
迴圈遍歷電話號碼對應的字母陣列,當沒有下一位電話號碼時列印輸出nu。
* @方法名: count
* @param num: 鍵盤傳入的電話號碼
* @param map: 電話號碼與字母形成的鍵值對關係的集合
* @param j: j為傳入電話號碼的字元下標,需要一個一個的取出電話號碼
* @return counts 組合數
* @返回型別 int
* @建立人 szj
* @建立時間 2018年11月18日下午1:46:28
* @修改人 Administrator
* @修改時間 2018年11月18日下午1:46:28
* @修改備註
*/
public int count(String num,HashMap map,int j){
String key=num.charAt(j++)+"";//利用j依次取出電話號碼中的單個字元
String mu=nu;//區域性變數,利用mu記錄下每層對應的字串組合
String[] ob=(String[]) map.get(Integer.parseInt(key));//從map集合中取出單個電話字元對應的字母陣列ob
for(int i=0;i<ob.length;i++){//for迴圈遍歷ob陣列
nu=(nu+ob[i]).trim();// 依次去除ob陣列中的字母,與nu字串組合,合併。
if(j<(num.length())){//如果還有下一個電話號碼,則遞迴呼叫count
count(num,map,j);
nu=mu;//遞迴返回後,將每層對應的字串組合mu複製給nu
}else{
System.out.println(nu);//如果沒有下一位電話號碼那就列印輸出
counts++;//組合數+1
nu=mu;//遞迴返回後,將每層對應的字串組合mu複製給nu
}
}
return counts; //返回組合數
}
}