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

题目:

电话的号码盘一般可以用于输入字母,如用2可以输入A,B,C,用3可以输入D,E,F等,对于号码5869872可以依次输出其代表的所有的字母组合。

解法一:直接循环法:

#include<iostream>
#include<stdio.h>

using namespace std;
#define TelLength 3

int main()
{
	char c[10][10]=
	{
			"",  //0
			"",  //1
			"ABC", //2
			"DEF", //3
			"GHI", //4
			"JKL", //5
			"MNO", //6
			"PQRS", //7
			"TUV", //8
			"WXYZ" //9
	};
	int total[10] = {0,0,3,3,3,3,4,3,4};
	int number[TelLength] = {4,2,7};
	int answer[TelLength] = {0,0,0};

	cout << "427" << "对应的所有英文是:\n";

	for(answer[0] = 0; answer[0] < total[number[0]]; answer[0] ++)
		for(answer[1] = 0; answer[1] < total[number[1]]; answer[1] ++)
			for(answer[2] = 0; answer[2] < total[number[2]]; answer[2] ++)
			{
				for(int i = 0; i < TelLength; i ++)
					cout << c[number[i]][answer[i]];
				cout << "\n";
			}

	getchar();
	return 0;
}

以上代码是三级的循环,如果多四级或5级的呢,那再加循环,太麻烦了。

来看下面的一种解法。

#include<iostream>
#include<stdio.h>

using namespace std;
#define TelLength 3
int main()
{
	char c[10][10]=
	{
			"",  //0
			"",  //1
			"ABC", //2
			"DEF", //3
			"GHI", //4
			"JKL", //5
			"MNO", //6
			"PQRS", //7
			"TUV", //8
			"WXYZ" //9
	};
	int total[10] = {0,0,3,3,3,3,4,3,4};
	int number[TelLength] = {4,2,7};
	int answer[TelLength] = {0,0,0};

	cout << "427" << "对应的所有英文是:\n";

	while(true)
	{
		for(int i = 0; i < TelLength; i ++)
			cout << c[number[i]][answer[i]];
		cout << "\n";
		int k = TelLength - 1;
		while(k >=0)
		{
			if(answer[k] < total[number[k]] - 1)
			{
				answer[k] ++;
				break;
			}
			else
			{
				answer[k] = 0; k --;
			}
		}
		if( k < 0)
			break;
	}
	getchar();
	return 0;
}

void RecursiveSearch(char c[10][10], int total[10], int* number, int* answer, int index, int n)
{
	if(index == n)
	{
		for(int i = 0; i < n; i ++)
			cout << c[number[i]][answer[i]];
		cout << "\n";
		return;
	}

	for(answer[index] = 0; answer[index] < total[number[index]]; answer[index] ++)
	{
		RecursiveSearch(c, total, number, answer, index + 1, n);
	}
}

解法二:递归方法

#include<iostream>
#include<stdio.h>

using namespace std;
#define TelLength 3
void RecursiveSearch(char c[10][10], int total[10],  int* number, int* answer, int index, int n);
int main()
{
	char c[10][10]=
	{
			"",  //0
			"",  //1
			"ABC", //2
			"DEF", //3
			"GHI", //4
			"JKL", //5
			"MNO", //6
			"PQRS", //7
			"TUV", //8
			"WXYZ" //9
	};
	int total[10] = {0,0,3,3,3,3,4,3,4};
	int number[TelLength] = {4,2,7};
	int answer[TelLength] = {0,0,0};

	cout << "427" << "对应的所有英文是:\n";

	RecursiveSearch(c, total, number, answer, 0, TelLength);
	getchar();
	cout << "hello world!" << endl;
	return 0;
}

void RecursiveSearch(char c[10][10], int total[10], int* number, int* answer, int index, int n)
{
	if(index == n)
	{
		for(int i = 0; i < n; i ++)
			cout << c[number[i]][answer[i]];
		cout << "\n";
		return;
	}

	for(answer[index] = 0; answer[index] < total[number[index]]; answer[index] ++)
	{
		RecursiveSearch(c, total, number, answer, index + 1, n);
	}
}
时间: 2025-01-11 18:38:37

编程之美题之电话号码对应英文单词的相关文章

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

题目一:根据电话上字母和数字的对应关系,用一个有意义的单词来表述一个电话号码,如用computer表示26678837 题目二:反过来,给定一个电话号码,是否可以用一个单词来表示呢?怎样表示最快呢?显然不是所有的电话号码都可以对应到单词上去 首先来看看leetcode上一个类似的题目: Letter Combinations of a Phone Number Given a digit string, return all possible letter combinations that t

编程之美第三题 序列变换tiyi

题意:   给你一个序列  ,  让你改变序列中的所有值,  最后保证序列变成一个绝对递增的序列   ,  也就是每个a[i+1] 〉a[i],   然后有一个消耗为 max | a[i] - b[i]|, 问消耗最小为多少. 题解:  很显然  最大值最小问题,  明显二分,  然后再保证第一个最小的同时  ,  后面的和第一个尽量靠近,  然后就A了    ,  这次编程之美比赛题目确实好水呀, 没sei了! 代码: #include<stdio.h> int n, mark[100000

编程之美之最短摘要生成

书上给出了最短摘要的描述即算法,简单来说就是: 扫描过程始终保持一个[pBegin,pEnd]的range,初始化确保[pBegin,pEnd]的range里包含所有关键字 .然后每次迭代,尝试调整pBegin和pEnd: 1.pBegin递增,直到range无法包含所有关键字 2.pEnd递增,直到range重新包含所有关键字 计算新的range,与旧的range相比,看是否缩短了,如果是,则更新 不考虑关键字的先后顺序 .这里给出最短摘要算法的几个应用,首先是leetcode上面的两题: M

《编程之美》3.6判断链表是否相交之扩展:链表找环方法证明

先看看原题:<编程之美>3.6编程判断两个链表是否相交,原题假设两个链表不带环. 为了防止剧透使得没看过原题目的读者丧失思考的乐趣,我把最好的解法隐藏起来.由于这个问题本身的解答并不是本文的重点,扩展问题也采用这种形式呈现. 注:位于(*)符号之间的文字出自于:http://blog.csdn.net/v_july_v/article/details/6447013,作者v_JULY_v. 用指针p1.p2分别指向两个链表头,不断后移:最后到达各自表尾时,若p1==p2,那么两个链表必相交 用

编程之美之字符串移位包含问题

[题目] 给定两个字符串s1和s2,要求判断s2是否能够被通过s1做循环移位(rotate)得到的字符串包含.例如,S1=AABCD和s2=CDAA,返回true:给定s1=ABCD和s2=ACBD,返回false. [分析] [思路一] 从题目中可以看出,我们可以使用最直接的方法对S1进行循环移动,再进行字符串包含的判断,从而遍历其所有的可能性. 字符串循环移动,时间复杂度为O(n),字符串包含判断,采用普通的方法,时间复杂度为O(n*m),总体复杂度为O(n*n*m). 字符串包含判断,若采

读《编程之美》读后感

读完<编程之美>后,我觉得这并不是简简单单的一本有关于编程的书,本书强调的不仅仅是程序或者考题本身,而是思维.这就和小学时看到数学奥林匹克竞赛的题一样,重要的不是套路或者定式,而在于独立思考时被自己激活的无数脑细胞.对于程序,也是一样,思维,才是程序的精髓所在.正如作者所言,书中展现的题目和分析,犹如海滩上美丽的石子和漂亮的贝壳那样,反映出造化之美,编程之美.该书的目的不仅在于揭开微软面试的神秘面纱,更是鼓励更多的编程爱好者从中收获自己的想法,开阔自己的眼界.作者更希望让面试者和被面试者都能够

求二进制数中1的个数(编程之美)

求二进制数中1的个数 继京东618店庆时买的<编程之美>这本书,翻了翻,发现里面的题还是挺有意思的,看起来我们觉得很简单的题目,解法却有很多很多种,真是一个比一个巧妙,于是,决定记录一下. 书中的题目如下 对于一个字节(8bit)的无符号数,求其二进制表示中"1"的个数,要求算法的执行效率尽可能高. 就像书中给我们说的一样,我们一般人可能想到的解决方法如下 int countOne(int n){ int count=0; while(n){ if(n%2==1){ cou

字符串移位[源:《编程之美》]

<编程之美>221页,问题:字符串scr=“AABCD”,字符串des="CDAA",移位src,是否包含串des?这本书今天初看,随便翻了几页,先不说问题,光是这本书排版就出现很多错误!马上感觉这本书失了水准,可能是印刷问题吧.比如,char src[5]="AABCD"...之类 记录这个小题,因为联想到昨天学的直接插入排序,也是在数组中相邻两两之间移动,顺便把它收录了,所谓题不厌多,只要类型相同,就归纳在一起! 首先考虑的是移位的问题,有两种可能,

leetcode&amp;编程之美——博文目录

leetcode刷题整理: 1——Two Sum(哈希表hashtable,map) 2——Add Two Numbers(链表) 3——Longest Substring Without Repeating Characters(set,哈希表,两个指针) 9——Palindrome Number (数学问题) 11——Container With Most Water(两个指针) 12——Integer to Roman(string,数学问题) 13——Roman to Integer(s