电话号码对应的英语单词

问题:

电话的号码盘一般可以用于输入字母,如用2可以输入a,b,c,用3可以输入d,e,f等。

对于号码5869872,可以依次输出其代表的所有字母组合。如:jtmwtpa,jtmwtpb.........

1、您能否可以根据这样的对应关系设计一个程序,尽可能快地从这些字母组合中找到一个有意义的单词来描述一个电话号码呢?如:可以用单词“computer”来描述号码26678837。

分析与解法:

对于问题1,不妨掏出电话来研究,我们可以发现,除了0,1之外,其他数字上最少都有3个字符,其中7和9上有4个字符,我们可以假设0,1都是空字符。

首先讲问题简单化,若电话号码只有一位数,比如说4,那么其代表的单词为g,h,i,据此可以画出一颗排列树,如下:

 

接着若电话号码升级到两位数,比如42,又将如何呢?分两步走,从左到右,在选择一个第一位数字所代表的字符的基础上,遍历第二位数字所代表的字符,直到遍历完第一位数字代表的所有字符。就拿42来说,4所能代表的字符为ghi,2所能代表的字符为abc,首先让4代表g,接着遍历2所能代表的所有字符,即可得到ga,gb,gc,然后再让4代表h,再次遍历2所能代表的所有字符,即可得到ha,hb,hc,最后让4代表i,那么同理可得到ia,ib,ic.

如图

问题1的解法:

将各个数字所能代表的字符存储在一个二维数组中,其中0,1所代表的字符为空字符,

 char[][]  c={{},{},{'a','b','c'},{'d','e','f'},{'g','h','i'},{'j','k','l'},{'m','n','o'},{'p','q','r','s'},{'t','u','v'},{'w','x','y','z'}};

并将各个数字所能代表的字符总数记录于另一个数组中:
int[] total = {0,0,3,3,3,3,3,4,3,4}; 

用一个数组存储电话号码:

int[tellength] number;

将数字目前所代表的字符在其所能代表的字符集中的位置用一个数组存储起来:

int[tellength] answer;

举个例子,若number[0]=4,即电话号码的第一位为4,若answer[0]=2,即4目前代表的字符为:

c[number[0]][answer[0]]=c[4][2] = 'i';

问题1的递归解法如下:

public class Test_3_2 {
	public static void main(String[] args) {
		int[] number={2,6,6,7,8,8,3,7};
		int len = number.length;
		int[] answer=new int[len];
		RecursiveSearch(number,answer,0,len);

	}

	public static void RecursiveSearch(int[] number,int[] answer,int index,int n){
		//index说明电话对电话号码第几位进行循环
		//n为电话号码位数
		char[][]  c={{},{},{'a','b','c'},{'d','e','f'},{'g','h','i'},{'j','k','l'},{'m','n','o'},{'p','q','r','s'},{'t','u','v'},{'w','x','y','z'}};
		int[] total = {0,0,3,3,3,3,3,4,3,4};
		if(index == n){
			for(int i = 0;i<n;i++){
				System.out.print(c[number[i]][answer[i]]);
				
			}
			System.out.print(";");
			return;
		}
		for(answer[index] = 0;answer[index]<total[number[index]];answer[index]++){
			RecursiveSearch(number,answer,index+1,n);
		}
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值