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

思路

1 对于第一个方法,为什么用数组不用其他存储形式,比如链表?因为用数组很多查找一次就可以完成。

2 对于递归方法,就是DFS。所以递归相对来说还比循环好写。但是循环方式的思路是很不错的。从最后一个字符开始变化,如果大于极限,则开始变化前一个一次。

3 但是代码有些细节问题。下面根据代码一个个说。


代码1

public static String[] record={
		" "," ","ABC","DEF","GHI","JKL","MNO","PQRS","TUV","WXYZ"
	};
	
	public static int[] total={1,1,3,3,3,3,3,4,3,4};
	
	public static void RecursiveSearch(int[] number,int index,int[] answer,int n){
		if(index == n){
			for(int i=0;i<number.length;i++){
				if(number[i]==0 ||number[i]==1){
					continue;
				}
				System.out.print(record[number[i]].charAt(answer[i]));
			}
			System.out.println();
			return;
		}
		for(answer[index]=0;answer[index]<total[number[index]];answer[index]++){
			RecursiveSearch(number, index+1, answer,n);
			
		}
	}

当碰到数字为0或者1时,按照书上的做法是无法继续执行下去的。因为answer[0]=0 永远不小于小于total[0]。

所以我做了一点改动,把0,1代表一个有空位的字符,当然他们代表的数量也分别为1。当最后是否要输出0,1的空字符时候,可以根据需要添加判断。

代码2

public static String[] record={
		"","","ABC","DEF","GHI","JKL","MNO","PQRS","TUV","WXYZ"
	};
	
	public static int[] total={0,0,3,3,3,3,3,4,3,4};
	
	public static void Search(int[] number){
		int n = number.length;
		int[] answer = new int[n];
		while(true){
			for(int i=0;i<n;i++){
				if(number[i]==0|| number[i]==1){
					continue;
				}
				System.out.print(record[number[i]].charAt(answer[i]));
			}
			System.out.println();
			int k = n-1;
			while(k>=0){
				if(answer[k]<total[number[k]]-1){
					answer[k]++;
					break;
				}
				else{
					answer[k]=0;
					k--;
				}
			}
			if(k<0){
				break;
			}
		}
	}
	

这里就比较简单只需要做个判断,不要让””.charAt(0)出现即可。

    原文作者:seawade
    原文地址: https://blog.csdn.net/xift810/article/details/38360659
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞