思路
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)出现即可。