Day63(回溯)

172、阶乘后的零

给定一个整数 n ,返回 n! 结果中尾随零的数量。

详细通俗的思路分析 - 阶乘后的零 - 力扣(LeetCode) (leetcode-cn.com)

class Solution {
    public int trailingZeroes(int n) {
        int ans=0;
        while(n>0){
            n/=5;
            ans+=n;
        }
        return ans;
    }
}

682、棒球比赛 

class Solution {
   public int calPoints(String[] ops) {
        int ans[] = new int[ops.length];
        int j=0;
        for (int i = 0; i < ops.length;i++ ) {
            switch (ops[i]) {
                case "+":
                    ans[j] = ans[j - 1] + ans[j - 2];
                    j++;
                    break;//退出switch循环
                case "D":
                    ans[j] = ans[j - 1] * 2;
                    j++;
                    break;
                case "C":
                    ans[j - 1] = 0;
                    j--;
                    break;
                default:
                    ans[j] = Integer.valueOf(ops[i]);
                    j++;
                    break;
            }
        }

        int sum = 0;
        for (int i = 0; i < ans.length; i++) {
            sum += ans[i];
        }
        return sum;
    }
}

 90、子集 II

 不重复的知识点——40组合总和II

class Solution {
    List<List<Integer>> ans=new ArrayList<>();
    List<Integer>path=new ArrayList<>();
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        ans.add(new ArrayList<>());
        
        //这一行加上if(i>startIndex&&nums[i-1]==nums[i]) continue;构成不重复
        Arrays.sort(nums);
        backtracking(nums,0);
        return ans;

    }
    public void backtracking(int []nums,int startIndex){
        if(startIndex==nums.length){
            return ;
        }
        for(int i=startIndex;i<nums.length;i++){
            if(i>startIndex&&nums[i-1]==nums[i]) continue;//这一行加上Arrays.sort(nums);构成不重复
            path.add(nums[i]);
            ans.add(new ArrayList<>(path));
            backtracking(nums,i+1);
            path.remove(path.size()-1);
        }
    }
}

93、复原 IP 地址

 判断是否子串是否合法

  • 段位以0为开头的数字不合法
  • 段位里有非正整数字符不合法
  • 段位如果大于255了不合法

backtracking(s,i+2,pointNum);//i+2是因为s里面加了一个分隔符. 而这个分隔符并不是我们要处理的 

class Solution {
    List<String>path=new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        if(s.length()<4||s.length()>12) return path;
        backtracking(s,0,0);
        return path;



    }
    public void backtracking(String s,int startIndex,int pointNum){
        if(pointNum==3){//分成4段,有3个.
        // 逗点数量为3时,分隔结束
        // 判断第四段子字符串是否合法,如果合法就放进result中
            if(isValid(s,startIndex,s.length()-1)){
                path.add(s);
            }
            return ;
        }

        for(int i=startIndex;i<s.length();i++){
            if(isValid(s,startIndex,i)){
                s=s.substring(0,i+1)+"."+s.substring(i+1);//2.5525511135
                pointNum++;
                backtracking(s,i+2,pointNum);//i+2是因为s里面加了一个分隔符. 而这个分隔符并不是我们要处理的
                pointNum--;
                s=s.substring(0,i+1)+s.substring(i+2);//变回25525511135即回溯删掉逗点
                System.out.println(s);
                
            }else{
                continue;
            }
        }
    }

    public boolean isValid(String s,int start,int end){
        //判断[start,end]里是否合法
        if(start>end) return false;
        //0开头的不合法  排除0.0.0.0这种情况start!=end
        if(s.charAt(start)=='0'&&start!=end) return false;
        int num=0;
        for(int i=start;i<=end;i++){
            if(s.charAt(i)>'9'||s.charAt(i)<'0') return false;//遇到非数字的排除
            num=num*10+(s.charAt(i)-'0');
            if(num>255) return false;//大于255的排除
        }
        return true;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值