第3章 结构之法——电话号码对应英语单词

电话号码对应英语单词

问题描述

分析与解法

详细代码如下:

 1 package chapter3jiegouzhifa.TelephoneMapWords;
 2 /**
 3  * 电话号码对应英语单词
 4  * @author DELL
 5  *
 6  */
 7 public class TelephoneMapWords1 {
 8     private int telLength;  //电话号码的位数
 9     private char c[][]={  //各个数字所能代表的字符
10             "".toCharArray(),  //0
11             "".toCharArray(),    //1
12             "ABC".toCharArray(),    //2
13             "DEF".toCharArray(),    //3
14             "GHI".toCharArray(),    //4
15             "JKL".toCharArray(),    //5
16             "MNO".toCharArray(),    //6
17             "PQRS".toCharArray(),    //7
18             "TUV".toCharArray(),    //8
19             "WXYZ".toCharArray(),    //9
20     };
21     private int total[]={0,0,3,3,3,3,3,4,3,4};  //每个数字所能代表的字符数
22     private int number[]; //电话号码
23     private int answer[];  //数字目前所代表的字符在其所能代表的字符集中的位置
24     //构造函数
25     public TelephoneMapWords1(int number[]){
26         this.number = number;
27         this.telLength = number.length;
28         answer = new int[telLength];
29     }
30     //输出电话号码对应英语单词
31     public void output(){
32         while(true){
33             for(int i=0;i<telLength;i++)
34                 System.out.print(c[number[i]][answer[i]]);
35             System.out.println();
36             int k = telLength - 1;
37             while(k>=0){
38                 if(answer[k]<total[number[k]]-1){
39                     answer[k]++;
40                     break;
41                 }else{
42                     answer[k]=0;
43                     k--;
44                 }
45             }
46             if(k<0)
47                 break;
48         }
49     }
50     public static void main(String[] args) {
51         int number[]={2,6,6,7,8,8,3,7};
52         TelephoneMapWords1 tmw = new TelephoneMapWords1(number);
53         tmw.output();
54
55     }
56
57 }

【问题1的解法二】递归方法

  其实可以从循环算法中的n个for循环方法中得到提示,每层for循环,其实可以看成一个递归函数的调用。具体代码如下:

 1 package chapter3jiegouzhifa.TelephoneMapWords;
 2 /**
 3  * 电话号码对应英语单词
 4  * 【解法二】递归方法
 5  * @author DELL
 6  *
 7  */
 8 public class TelephoneMapWords2 {
 9     private int telLength;  //电话号码的位数
10     private char c[][]={  //各个数字所能代表的字符
11             "".toCharArray(),  //0
12             "".toCharArray(),    //1
13             "ABC".toCharArray(),    //2
14             "DEF".toCharArray(),    //3
15             "GHI".toCharArray(),    //4
16             "JKL".toCharArray(),    //5
17             "MNO".toCharArray(),    //6
18             "PQRS".toCharArray(),    //7
19             "TUV".toCharArray(),    //8
20             "WXYZ".toCharArray(),    //9
21     };
22     private int total[]={0,0,3,3,3,3,3,4,3,4};  //每个数字所能代表的字符数
23     private int number[]; //电话号码
24     private int answer[];  //数字目前所代表的字符在其所能代表的字符集中的位置
25     //构造函数
26     public TelephoneMapWords2(int number[]){
27         this.number = number;
28         this.telLength = number.length;
29         answer = new int[telLength];
30     }
31     //输出电话号码对应英语单词
32     public void output(int index){
33         if(index==telLength){
34             for(int i=0;i<telLength;i++)
35                 System.out.print(c[number[i]][answer[i]]);
36             System.out.println();
37             return;
38         }
39         for(answer[index]=0;answer[index]<total[number[index]];answer[index]++){
40             output(index+1);
41         }
42     }
43     public static void main(String[] args) {
44         int number[]={2,6,6,7,8,8,3,7};
45         TelephoneMapWords2 tmw = new TelephoneMapWords2(number);
46         tmw.output(0);
47
48     }
49
50 }

时间: 2024-11-05 01:43:33

第3章 结构之法——电话号码对应英语单词的相关文章

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

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

第3章 结构之法——重建二叉树

重建二叉树 问题描述 分析与解法 用java实现的代码如下: 1 package chapter3jiegouzhifa.RebuildBinTree; 2 3 /** 4 * 重建二叉树 5 * 递归解法 6 * @author DELL 7 * 8 */ 9 public class RebuildBinTree { 10 //定义节点类 11 public static class Node{ 12 int left; //左子树位置 13 int right; //右子树位置 14 ch

第3章 结构之法——字符串移位包含的问题

字符串移位包含的问题 问题描述 分析与解法 [解法一] 具体代码如下: 1 package chapter3jiegouzhifa.QuestionOfStringMove; 2 /** 3 * 字符串移位包含的问题 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public class StringMove { 9 /** 10 * 寻找移位后的字串(左移) 11 * @param src 源字符串 12 * @param des 要查找的子串 13 * @ret

程之美第3章结构之法-字符串及链表的探索3.7 队列中取最大值操作问题

#include<iostream> #include<vector> using namespace std; class stack { private: vector<int> vec;//用来保存当前进栈的值 vector<int> max_vec; public: void push(int a) { vec.push_back(a); if(max_vec.size()==0||a>vec[max_vec[max_vec.size()-1]

第3章 结构之法——计算字符串的相似度

计算字符串的相似度 问题描述 分析与解法 具体代码如下: 1 package chapter3jiegouzhifa.StringSimilarity; 2 /** 3 * 计算字符串的相似度 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public class StringSimilarity { 9 public static int CalculateStringDistance(String str1, int b1, int e1, String str

第三章结构之法--------字符串移位包含

字符串移位包含的问题 给定两个字符串s1和s2,要求判定s2是否能够被s1做循环移位(rotate)得到的字符串包含. 例如,给定s1=AABCD和s2=CDAA,s1可以通过向右移动两位,s1------>BCDAA,使得s1包含s2,返回true. 而对于s1=ABCD和s2=ACBD,无论s1怎么移动,都无法包含s2,则返回false. 分析与解法 解法1: 这一道题,一开始我并没有想到什么好的解题思路.首先想到的是用暴力枚举的方法,将所有移位后字符串都 列举出来,在进行判断.并且移动的次

3.2 电话号码对应英语单词

原始问题如下:手机上面的数字键均对应了几个字符,譬如2对应了a,b,c.问题是当输入一段数字后,求出所有可能的字符组合 第一种方法:假设电话号码是n个数字,那么就n个for循环. 这方法果断不好 第二个方法: #include <iostream> #include <string> using namespace std; char c[10][10] = { "", "", "ABC", "DEF"

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

java实现: import java.util.ArrayList; import java.util.List; public class Telphone { /** * 保存每个数字对应的字母序列 */ static String[] c = new String[] { "", // 0 "", // 1 "abc", // 2 "def", // 3 "ghi", // 4 "jkl&

MongoDB树形结构表示法

http://docs.mongodb.org/manual/tutorial/model-tree-structures/ MongoDB五种树形结构表示法 第一种:父链接结构 db.categories.insert( { _id: "MongoDB", parent: "Databases" } ) db.categories.insert( { _id: "dbm", parent: "Databases" } ) d