面试经典150题(84-84.5)

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);
    }
}

回溯也好难。。。但是这块貌似面试挺多的还得好好看。。

加油,早日跳槽!!!

你可能感兴趣的:(面试经典,150,题,面试,算法,数据结构,leetcode)