LeetCode第17题 电话号码和数字的组合

在这里插入图片描述
看起来还好啊,为什么会是中等题

第一反应

看起来只要用循环,检验输入了哪几个数字,找出对应的字母然后依次组合就行。但是问题就在“依次组合”,由于不知道要循环几层(虽然题目说了最多四层,可以穷举,但是穷举了写感觉好傻),具体该怎么写呢?
刚刚意识到,这个结构可以看成一个树,根节点空,根节点的子节点是第一个数字对应的字母,以此类推,只要找出所有叶子结点的所有父节点。那这就变成了一个遍历树的问题
那具体应该怎么实现呢?总不至于真的搞个链表出来,然后建立树的结构吧?我想到,能不能用数组来管理,毕竟我不需要用树的结构来寻找,我只要依次找到每一个叶子结点就行。那我这样,搞一个长度为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);
    }
}

别人的题解

看到有用递归写的,应该也可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值