Java递归电话号码字母
如何使用递归方法编写java程序,该方法接收“234”这样的int,并将其转换为手机键盘上相应的字母(2=ABC、3=DEF等),然后打印出其排列?e、 g: 输入=234 输出=ADG ADH ADI AEG AEH AEI AFG AFH AFI BDG BDH BDI BEG BEG BFG BFH BFI CDG CDH CDI CEG CEH CEI CFG CFH CFIJava递归电话号码字母,java,recursion,Java,Recursion,如何使用递归方法编写java程序,该方法接收“234”这样的int,并将其转换为手机键盘上相应的字母(2=ABC、3=DEF等),然后打印出其排列?e、 g: 输入=234 输出=ADG ADH ADI AEG AEH AEI AFG AFH AFI BDG BDH BDI BEG BEG BFG BFH BFI CDG CDH CDI CEG CEH CEI CFG CFH CFI 输入=89 输出=TW TX TY TZ UX UY UZ VW VX VY VZ 获取输入,转换为字符串 调
输入=89 输出=TW TX TY TZ UX UY UZ VW VX VY VZ
单独生成排列将构成一个很好的家庭作业,更不用说强制递归和电话号码干扰了 通过类似于的方法,可以有效地生成少量置换。n个元素的序列有n!置换(假设全画,每个置换也由n个元素组成)。请注意,对于双元素序列,有两种排列:
- 原始序列,以及
- 这两个元素互换了
- 下面两个元素的排列,然后
- 将序列向右(或向左)旋转一个单元格,然后
- 下面两个元素的排列,然后
- 将序列向左(或向右,与上面相反)旋转一个单元格,然后
- 底部两个元素的排列
- 下面三个元素的排列,然后
- 保存位置1,将0指定给1,将3指定给0,将保存的值指定给3,然后
- 下面三个元素的排列,然后
- 交换位置0和2,交换位置1和3(或向右旋转2),以及
- 下面三个元素的排列,然后
- 保存位置3,将2指定给3,将0指定给2,将保存的值指定给0,然后
- 底部三个元素的排列
还要注意,这里发布的大多数解决方案都使用type
String
,并不断地将其切碎并重新组装<代码>字符串是一个糟糕的选择,因为它是不可变的,当生成置换时,最好通过交换和旋转向量(实际上是一个环)中的元素来完成
这是一种罕见的情况,您实际上必须将字母写入目标流,因此请将您的解决方案与该操作进行对比。使用一个字符数组,并在发出特定排列时将字符逐个写入流。形成一个字符串只是为了将条目转储到流中,这涉及到不必要的分配和复制。仅生成排列将构成一个很好的家庭作业,更不用说强制递归和电话号码干扰了 通过类似于的方法,可以有效地生成少量置换。n个元素的序列有n!置换(假设全画,每个置换也由n个元素组成)。请注意,对于双元素序列,有两种排列:
- 原始序列,以及
- 这两个元素互换了
- 下面两个元素的排列,然后
- 将序列向右(或向左)旋转一个单元格,然后
- 下面两个元素的排列,然后
- 将序列向左(或向右,与上面相反)旋转一个单元格,然后
- 底部两个元素的排列
- 下面三个元素的排列,然后
- 保存位置1,将0指定给1,将3指定给0,将保存的值指定给3,然后
- 下面三个元素的排列,然后
- 交换位置0和2,交换位置1和3(或向右旋转2),以及
- 下面三个元素的排列,然后
- 保存位置3,将2指定给3,将0指定给2,将保存的值指定给0,然后
- 底部三个元素的排列
还要注意,这里发布的大多数解决方案都使用type
String
import java.util.ArrayList; class PhoneNumbers { public static void main(String[] args) { for (String result: convert(args[0])) System.out.println(result); } public static ArrayList<String> convert(String phoneNumber) { int digit = Integer.parseInt(phoneNumber.substring(0, 1)); String letters = new String[] { "0", "1", "ABC", "DEF", "GHI", "JKL", // etc... }[digit]; ArrayList<String> result = new ArrayList<String>(); for (int i = 0; i < letters.length(); ++i) { char letter = letters.charAt(i); if (phoneNumber.length() > 1) { for (String rest: convert(phoneNumber.substring(1))) result.add(letter + rest); } else { result.add("" + letter); } } return result; } }
ADG
ADH
ADI
AEG
AEH
AEI
AFG
AFH
AFI
...
String[] allLetters = new String[] {
"0",
"1",
"ABC",
"DEF",
"GHI",
"JKL",
// etc...
};
public static void convert(String phoneNumber)
{
convertSubstring(phoneNumber,"");
}
private static void convertSubstring(String phoneNumber, String convertedLetters)
{
int digit = Integer.parseInt(phoneNumber.substring(0, 1));
String letters=allLetters[digit];
String remainingString=phoneNumber.substring(1);
for (int i = 0; i < letters.length(); ++i)
{
char letter = letters.charAt(i);
String result=convertedLetters+letter;
if (remainingString.length()==0)
System.out.println(result);
else
convertSubstring(remainingString, result);
}
}
public class printKeypad {
public static char[] keynotes(int n)
{
String s[]= {"","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
String s1=s[n-1];
char c[]=new char[s1.length()];
for(int i=0;i<c.length;i++)
{
c[i]=s1.charAt(i);
}
return c;
}
public static void printKeypad(int n)
{
printKeypad(n,"");
}
public static void printKeypad(int n,String output)
{
if(n==0)
{
System.out.println(output);
return;
}
char c[]=keynotes(n%10);
for(int i=0;i<c.length;i++)
{
printKeypad(n/10,output+c[i]);
}
}
public static void main(String[] args) {
int n=23;
printKeypad(n);
}