神奇数字的数量 DFS深度优先搜索

这里写图片描述

题意如上图,这个题主要就是如何判断一个数字是不是神奇数字,这个技术拆分出所有的位,然后DFS深度优先遍历判断。

代码如下:

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

public class Solution
{
    /*
     * 神奇数字的判断
     * */
    boolean getCount(int num)
    {
        //小于10的肯定不是
        if(num<=10)
            return false;

        String numStr=""+num;
        int sum=0;
        List<Integer> list=new ArrayList<Integer>();
        for(int i=0;i<numStr.length();i++)
        {
            int oneBit=numStr.charAt(i)-'0';
            sum+=oneBit;
            list.add(oneBit);
        }

        //奇数肯定不是
        if(sum%2==1)
            return false;

        return isRes(list,sum/2,0,0);
    }

    /*
     * DFS神奇数字的判断
     * 就是选择当前数字和不选择当前数字的递归搜索
     * */
    private boolean isRes(List<Integer> list, int target, int index, int sum) 
    {
        if(sum>target)
            return false;
        else if(sum==target)
            return true;

        if(index==list.size())
            return sum==target;
        else 
        {
            //选择当前数组
            boolean add=isRes(list, target, index+1, sum+list.get(index));
            if(add==false)
                return isRes(list, target, index+1, sum); //不选择
            else 
                return true;
        }
    }

    //统计left到right的神奇数字的数量
    int getMagicNum(int left,int right)
    {
        int res=0;
        for(int i=left;i<=right;i++)
        {
            if(getCount(i))
                res++;
        }
        return res;
    }

    public static void main(String[] args) 
    {
        Solution solution=new Solution();
        System.out.println(solution.getMagicNum(1, 50));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值