leetcode 150道题 计划花两个月时候刷完,今天(第四十二天)完成了1道(84)150:
84.(17. 电话号码的字母组合)题目描述:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
第一版(看的解题,感觉这个不知道循环层数,然后去用递归模拟循环层数是个模板啊,但是我看玩了第二题还是没弄出来。。)
class Solution {List<String> res=new ArrayList();public List<String> letterCombinations(String digits) {if(digits==null||digits.length()==0){return res;}String[] strs=new String[digits.length()];init(strs,digits);letterCombinationsCore(strs,new StringBuffer(),0);return res;}public void letterCombinationsCore(String[] strs,StringBuffer sb,int index){if(index==strs.length){res.add(sb.toString());return ;}// 就下面这个感觉是个模板。。for(int i=0;i<strs[index].length();i++){sb.append(strs[index].charAt(i));letterCombinationsCore(strs,sb,index+1);sb.deleteCharAt(sb.length()-1);}}public void init(String[] strs,String digits){for(int i=0;i<digits.length();i++){if(digits.charAt(i)=='2'){strs[i]="abc";}else if(digits.charAt(i)=='3'){strs[i]="def";}else if(digits.charAt(i)=='4'){strs[i]="ghi";}else if(digits.charAt(i)=='5'){strs[i]="jkl";}else if(digits.charAt(i)=='6'){strs[i]="mno";}else if(digits.charAt(i)=='7'){strs[i]="pqrs";}else if(digits.charAt(i)=='8'){strs[i]="tuv";}else{strs[i]="wxyz";}}}
}
85.(77. 组合)题目描述:
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
还没做出来。。写的不对。。。我这个一次只能换一个。。
第一版
class Solution {List<List<Integer>> res=new ArrayList();public List<List<Integer>> combine(int n, int k) {if(n<k){return res;}int[] nums=new int[n];for(int i=1;i<=n;i++){nums[i-1]=i;}selectKNum(nums,k,0);return res;}public void selectKNum(int[] nums, int k,int start) {if(nums.length-start<k){return ;}List<Integer> list=new ArrayList();int i=start;for(;i<start+k;i++){list.add(nums[i]);}res.add(list);start=i;// 代表这次换第几个if(k>1){for(int index=0;index<k;index++){for(;i<nums.length;i++){List<Integer> temp=new ArrayList();for(int m=0;m<k;m++){if(m!=k-1-index){temp.add(list.get(m));}}temp.add(nums[i]);res.add(temp);}i=start;}}selectKNum(nums,k,start);}
}
回溯也好难。。。但是这块貌似面试挺多的还得好好看。。
加油,早日跳槽!!!