LeetCode刷题记录(1)

LeetCode刷题记录
------分割线------
刷题记录1: 17.电话号码的字母组合



前言

想到什么写什么:

之前自己自己在准备华为机试的时候,刷了一段时间题,机考还挺顺利的,可能运气还可以,抽到的三道题自己都会,做完的感觉还挺棒,就想着以后每天保持至少刷一题的节奏,同时记录一下自己的代码,方便闲时自己可以翻阅,看有没有再精进的地方,仅用于自己反思罢了。


提示:以下是本篇文章正文内容,下面案例可供参考

一、题目内容

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、自己的思路

	看到这道题,其实就是一个简单的排列组合问题,逻辑很简单,主要是怎么写。这种题自己第一反应就是先把2到9的对应数据全部放到一个map中,方便后续遍历的时候进行翻译,然后通过递归,这里需要提炼一个函数,然后处理到最后一位时,将结果塞入结果集中,即可。

三、自己的代码实现

class Solution {

	//list用于返回
    List<String> list = new ArrayList<>();
    //map用于存储2-9的翻译
    Map<String,String> map = new HashMap<>();
    
    public List<String> letterCombinations(String digits) {
        map.put("2","abc");
        map.put("3","def");
        map.put("4","ghi");
        map.put("5","jkl");
        map.put("6","mno");
        map.put("7","pqrs");
        map.put("8","tuv");
        map.put("9","wxyz");
        String[] strArray = digits.split("");
        append(strArray,"",0);
        return list;
    }
//这代码肯定还能优化下写法,感觉不够美观
    public void append(String[] array,String str,int index){
        if(array.length>index){
            String val = map.get(array[index]);
            //本来是没这个的,本地idea测试也没问题,但力扣会执行错误,提示为Null,所以加上了
            if(val!=null){
                String[] strArray = val.split("");
                for(int i=0;i<strArray.length;i++){
                    String nerStr = str+strArray[i];
                    append(array,nerStr,index+1);
                    if(index==array.length-1){
                        list.add(nerStr);
                    }
                }
            }
        }
    }
}

四、精选代码

(摘取自力扣题解精选,详细地址见代码下方)

import java.util.ArrayList;
import java.util.List;

public class Solution17_1 {

private String letterMap[] = {
        " ",    //0
        "",     //1
        "abc",  //2
        "def",  //3
        "ghi",  //4
        "jkl",  //5
        "mno",  //6
        "pqrs", //7
        "tuv",  //8
        "wxyz"  //9
};

private ArrayList<String> res;

public List<String> letterCombinations(String digits) {

    res = new ArrayList<String>();
    if(digits.equals(""))
        return res;

    findCombination(digits, 0, "");
    return res;
}

private void findCombination(String digits, int index, String s){

    if(index == digits.length()){
        res.add(s);
        return;
    }

    Character c = digits.charAt(index);
    String letters = letterMap[c - '0'];
    for(int i = 0 ; i < letters.length() ; i ++){
        findCombination(digits, index+1, s + letters.charAt(i));
    }

    return;
}

}

作者:乌鲁木齐001号程序员
链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

跟精选感觉思想差别不大,写法可以再更简练点吧,看解答的时候有人说用StringBuffer,虽然它不用生成新对象,但它每次重新循环的时候都要回溯,去掉之前的部分数据,因为它始终是一个对象,只是最后添加的时候用toString方法而已,看有人测试说时间开销似乎比String还要大点,这种就是看自己更看重哪块吧,是时间效率还是空间优化,

总结

开心就好,过完这无聊的一生。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值