看起来还好啊,为什么会是中等题
第一反应
看起来只要用循环,检验输入了哪几个数字,找出对应的字母然后依次组合就行。但是问题就在“依次组合”,由于不知道要循环几层(虽然题目说了最多四层,可以穷举,但是穷举了写感觉好傻),具体该怎么写呢?
刚刚意识到,这个结构可以看成一个树,根节点空,根节点的子节点是第一个数字对应的字母,以此类推,只要找出所有叶子结点的所有父节点。那这就变成了一个遍历树的问题
那具体应该怎么实现呢?总不至于真的搞个链表出来,然后建立树的结构吧?我想到,能不能用数组来管理,毕竟我不需要用树的结构来寻找,我只要依次找到每一个叶子结点就行。那我这样,搞一个长度为4的二维字符串数组,0用来存储第一个字符的字母组合,1用来存储基于0的加上第二个字母的组合,以此类推。感觉还好。
补充:刚刚想到,不像python可以随意增加数组的长度,java的数组是固定长度的,这样可能要直接申请一个达到最大可能长度的数组,显然空间利用率很低,不过也没办法。
java复习的知识
关于hashmap
这玩意儿构造起来比python麻烦好多啊
HashMap< String, String> hMap =
new HashMap< String, String>();
hMap.put("1", "1st");
hMap.put("2", "2nd");
hMap.put("3", "3rd");
初始化二维字符串数组
String[][] arrStr = new String[3][4];
char字符转string
String str = String.valueOf('c');
arraylist 对我来说这个算新知识
长度动态变化的数组
arraylist嵌套
ArrayList<ArrayList<Person>> list = new ArrayList<>();
ArrayList<Person> first = new ArrayList<>(); //创建第一个班级
遍历ArrayList
for(Iterator it2 = list.iterator();it2.hasNext();){
System.out.println(it2.next());
}
提交通过
class Solution {
HashMap<String, String> digToLetter = new HashMap<String, String>();
public List<String> letterCombinations(String digits) {
if(digits.length() == 0){
return new ArrayList<>();
}
digToLetter.put("2","abc");
digToLetter.put("3","def");
digToLetter.put("4","ghi");
digToLetter.put("5","jkl");
digToLetter.put("6","mno");
digToLetter.put("7","pqrs");
digToLetter.put("8","tuv");
digToLetter.put("9","wxyz");
ArrayList<ArrayList<String>> ans = new ArrayList<>();
for(int i = 0 ; i < digits.length() ; i ++){
ArrayList<String> list_i = new ArrayList<>();
String digit =String.valueOf(digits.charAt(i));
String thisLetter = digToLetter.get(digit);
System.out.println(thisLetter);
if(i > 0){
for(Iterator it = ans.get(i-1).iterator(); it.hasNext(); ){
String base = (String)(it.next());
for(int j = 0 ; j < thisLetter.length() ; j++){
list_i.add(base + String.valueOf(thisLetter.charAt(j)));
}
}
}else{
for(int j = 0 ; j < thisLetter.length(); j++){
list_i.add(String.valueOf(thisLetter.charAt(j)));
}
}
ans.add(list_i);
}
return ans.get(digits.length()-1);
}
}
别人的题解
看到有用递归写的,应该也可以