电话号码对应的字符组合:在电话或者手机上,一个数字如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 1904479327@qq.com
*/
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; //返回组合数
}
}