1. 程式人生 > >判斷電話號碼對應字母組合數

判斷電話號碼對應字母組合數

電話號碼對應的字元組合:在電話或者手機上,一個數字如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;	//返回組合數
	}

}