编程之美读书笔记-电话号码对应英语单词

原创 2016年08月31日 13:06:41

题目:电话的号码盘一般可以用于输入字母,如用2可以输入a,b,c,用3可以输入d,e,f等。 对于号码5869872,可以依次输出其代表的所有字母组合。如:jtmwtpa,jtmwtpb……… 
您能否可以根据这样的对应关系设计一个程序,尽可能快地从这些字母组合中找到一个有意义的单词来描述一个电话号码呢?如:可以用单词computer来描述号码26678837。
解析:画出42所表示的排列树,如图所示。


采用循环的代码如下。

#include <iostream> 
using namespace std;
#define TellLength 11

//将每个数字所能代表的字符记录在一个二维数组中,其中假设0、1所代表的字符为空字符
char c[10][10] =
{
	"",        //0
	"",        //1
	"ABC",     //2
	"DEF",     //3
	"GHI",     //4
	"JKL",     //5
	"MNO",     //6
	"PQRS",    //7
	"TUV",     //8
	"WXYZ"     //9
};
//将每个数字所能代表的字母的总数记录在total数组中
int total[10] = { 0, 0, 3, 3, 3, 3, 3, 4, 3, 4 };
//将电话号码记录在number数组中
int number[TellLength];
//将数字目前所代表的字母在c数组中的列数下标记录在answer数组中,初始时为0
int answer[TellLength];

int main()
{
	number[0] = 1;
	number[1] = 8;
	number[2] = 7;
	number[3] = 0;
	number[4] = 1;
	number[5] = 1;
	number[6] = 2;
	number[7] = 7;
	number[8] = 7;
	number[9] = 2;
	number[10] = 0;
	while (true)
	{
		for (int i = 0; i < TellLength; i++) printf("%c", c[number[i]][answer[i]]);
		printf("\n");
		int k = TellLength - 1;
		while (k>=0)
		{
			if (answer[k] < total[number[k]] - 1)
			{
				answer[k]++;
				break;
			}
			else
			{
				answer[k] = 0;
				k--;
			}
		}
		if (k < 0) break;
	}
	return 0;
}
采用递归的代码如下。
#include <iostream> 
using namespace std;
#define TellLength 11

//将每个数字所能代表的字符记录在一个二维数组中,其中假设0、1所代表的字符为空字符
char c[10][10] =
{
	"",        //0
	"",        //1
	"ABC",     //2
	"DEF",     //3
	"GHI",     //4
	"JKL",     //5
	"MNO",     //6
	"PQRS",    //7
	"TUV",     //8
	"WXYZ"     //9
};
//将每个数字所能代表的字母的总数记录在total数组中
int total[10] = { 0, 0, 3, 3, 3, 3, 3, 4, 3, 4 };
//将电话号码记录在number数组中
int number[TellLength];
//将数字目前所代表的字母在c数组中的列数下标记录在answer数组中,初始时为0
int answer[TellLength];

void RecursiveSearch(int *number, int *answer, int index)
{
	if (index == TellLength-1)
	{
		for (int i = 0; i < TellLength; i++) printf("%c", c[number[i]][answer[i]]);
		printf("\n");
		return;
	}
	if(total[number[index]]==0) RecursiveSearch(number, answer, index + 1);
	for (answer[index] = 0; answer[index] < total[number[index]]; answer[index]++)
		RecursiveSearch(number, answer, index + 1);
}

int main()
{
	number[0] = 1;
	number[1] = 8;
	number[2] = 7;
	number[3] = 0;
	number[4] = 1;
	number[5] = 1;
	number[6] = 2;
	number[7] = 7;
	number[8] = 7;
	number[9] = 2;
	number[10] = 0;
	RecursiveSearch(number, answer, 0);
	return 0;
}


版权声明:

相关文章推荐

编程之美之电话号码对应英语单词

题目一:根据电话上字母和数字的对应关系,用一个有意义的单词来表述一个电话号码,如用computer表示26678837 题目二:反过来,给定一个电话号码,是否可以用一个单词来表示呢?怎样表示最快呢?...

编程之美: 第三章 结构之法 3.2电话号码对应英语单词

/* 电话号码对应英语单词: 电话的号码盘一般可以用于输入字母。如用2可以输入A,B,C,用3可以输入D,E,F等。 对于号码5869872,可以依次输出其代表的所有字母组合。例如:JTMWTPA,J...

[编程之美] PSet3.2 电话号码对应英语单词

 问题描述:        对如非全键盘的手机上的数字,每个数字都对应一些字母,比如2对应ABC,3对应DEF.........,8对应TUV,9对应WXYZ,要求对一段数字,输出其代表的所有...

编程之美3.2 电话号码对应英语单词

java实现: import java.util.ArrayList; import java.util.List; public class Telphone { /** * 保存每个数...

[经典面试题][百度]电话号码对应英语单词

题目现在有一个手机,手机上的键盘上有这样的对应关系,2对应”abc”,3对应”def”…..手机里面有一个userlist用户列表,当我们输入942的时候出来拼音的对应可能是“xia”,“zha”,“...

电话号码对应的英语单词

具体问题描述见:《编程之美》-3.2 电话号码对应英语单词,在本文中主要根据《编程之美》中的思想分别利用递归与非递归的思想实现了电话号码对应英语单词的构造实现,主要考虑了排列树的思想,利用遍历树中的每...

3.2 电话号码对应的英语单词

1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析一个数字, 对应一个字符数组, 这个问题其实就是穷举出这个数字数组能够表示的所有的字符的拼凑, 然后找出为单词的序列 这里...

编程之美3.2 电话号码对应英语字母

这也是一道很常见的题目,好多类似的题目用的也是同样的解法,这道题目的意思是,我们的手机上的数字键上面对应着英文字母,那么这个数字可能对应3个,也可能对应4个,也有可能对应0个,那么,当我输入一串数字后...

编程之美 3.2 :电话号码对应的英文单词

备份 12点28 /* * 3.2电话号码对应的英文单词 * * 刚开始我还以为本题会给我一个多么惊人的答案 * 结果发现,也只是穷举之后再去和字典匹配 * * 尽管如此,本题虽然给了伪代...

编程之美--3.2电话号码对应英文单词

思路 1 对于第一个。 2 这道题目相对
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)