LeetCode刷题记录
------分割线------
刷题记录1: 17.电话号码的字母组合
前言
想到什么写什么:
之前自己自己在准备华为机试的时候,刷了一段时间题,机考还挺顺利的,可能运气还可以,抽到的三道题自己都会,做完的感觉还挺棒,就想着以后每天保持至少刷一题的节奏,同时记录一下自己的代码,方便闲时自己可以翻阅,看有没有再精进的地方,仅用于自己反思罢了。
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目内容
二、自己的思路
看到这道题,其实就是一个简单的排列组合问题,逻辑很简单,主要是怎么写。这种题自己第一反应就是先把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还要大点,这种就是看自己更看重哪块吧,是时间效率还是空间优化,
总结
开心就好,过完这无聊的一生。