LeetCode 306. Additive Number

分析

难度 中
来源 https://leetcode.com/problems/additive-number/

题目

Additive number is a string whose digits can form additive sequence.
A valid additive sequence should contain at least three numbers. Except for the first two numbers, each subsequent number in the sequence must be the sum of the preceding two.
Given a string containing only digits ‘0’-‘9’, write a function to determine if it’s an additive number.
Note: Numbers in the additive sequence cannot have leading zeros, so sequence 1, 2, 03 or 1, 02, 3 is invalid.
Example 1:
Input: “112358”
Output: true
Explanation: The digits can form an additive sequence: 1, 1, 2, 3, 5, 8.
1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
Example 2:
Input: “199100199”
Output: true
Explanation: The additive sequence is: 1, 99, 100, 199.
1 + 99 = 100, 99 + 100 = 199
Follow up:
How would you handle overflow for very large input integers?

解答

Runtime: 1 ms, faster than 95.87% of Java online submissions for Additive Number.
Memory Usage: 35.4 MB, less than 55.00% of Java online submissions for Additive Number.


package LeetCode;

public class L306_AdditiveNumber {
    private boolean isAdditiveNumber(String num,long num1,long num2){
        System.out.println("\t"+num1+"\t"+num2);
        long sum=num1+num2;
        String sumStr=String.valueOf(sum);
        if(num.startsWith(sumStr)) {
            if(sumStr.equals(num))
                return true;
            else
                return isAdditiveNumber(num.substring(sumStr.length()), num2, sum);
        }
        return false;
    }
    public boolean isAdditiveNumber(String num){
        long temp1,temp2;
        int len=num.length();
        if(num.length()<3)
            return false;
        for(int i=1;i<=num.length()/2;i++)
        {
            System.out.println("i:"+i);
            if(num.charAt(0)=='0'&&i>1)//i>1即第一个数位数>=2且以0开头
                return false;
            temp1=Long.valueOf(num.substring(0,i));
            for(int j=i+1;j<=Math.min(len-i,(len+i)/2);j++){//len-j>=i&&len-j>=j-i
                System.out.println("\tj:"+j);
                if(num.charAt(i)=='0'&&j-i>=2)//个位数的话,可以为2;多位数的话,不能以2开头。下同
                    break;
                if(num.charAt(j)=='0'&&len-j>=2)
                    continue;
                temp2=Long.valueOf(num.substring(i,j));
                if(isAdditiveNumber(num.substring(j),temp1,temp2))
                    return true;
            }
        }
        return false;
    }

    public static void main(String[] args){
        L306_AdditiveNumber l306=new L306_AdditiveNumber();
        //String num="112358";//true
        //String num="199100199";//true
        //String num="101";//true
        String num="000";//true
        System.out.println(l306.isAdditiveNumber(num));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值