判断电话号码对应字母组合数

8 篇文章 0 订阅

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

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值