LeetCode OJ 306 Additive Number [Medium]

题目描述:

Additive number is a string whose digits can formadditive sequence.

A valid additive sequence should contain at least threenumbers. Except for the first two numbers, each subsequent number in thesequence must be the sum of the preceding two.

For example:
"112358" is an additive number because thedigits can form an additive sequence: 1, 1, 2, 3, 5, 8.

       1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8

"199100199" is also an additive number, theadditive sequence is: 1, 99, 100, 199.

        1 + 99 = 100, 99 + 100 = 199

Note: Numbersin the additive sequence cannot have leading zeros, so sequence 1, 2, 03 or 1,02, 3 is invalid.

Given a string containing only digits '0'-'9', write afunction to determine if it's an additive number.

Follow up:
How would you handle overflow for very large input integers?

题目理解:

给定一个由0至9数字组成的字符串,判断它是否满足从第三个数字开始,每个数字都等于前两个数字之和;02这样的数字是非法的;考虑如何解决整数溢出问题。

我的分析:

1.   只要选定了第一个数子和第二个数字,后面可以用相同的模式判断每一个数字是否等于前两个数字之和;

2.   这种相同的模式用递归实现,详情见代码

3.   String.substring(int beginIndex, intendIndex) 左闭右开;

4.    只需判断判断第一个数字和第二个数字是否出现01,023,0654等这样的数字;

5.   用双层for循环选择第一个数字和第二个数字;

6.   第一个数字的长度一定小于字符串长度的一半(无论长度是奇数或者偶数,这一规则都可以成立),因为第三个数字一定大于等于第一个数字;

7.   第二个数字的长度最大值也存在,保证第三个数字的长度>=第一个数字长度和第二个数字长度;

8.   用long型解决大整数的溢出问题

我的解答:

static public boolean isAdditiveNumber(String num) {
    char[] nums = num.toCharArray();
    int n = num.length();
    //选择第一个数字first,这里i表示第一个数字结束的位置(结束位置在区间中是开的),也是第一个数字的长度
    for(int i = 1; i <= n / 2; i++){
        if(nums[0] == '0' && i > 1) break;
        //选择第二个数字second,这里j表示第二数字结束的位置(结束位置在区间中是开的),j-i是第二个数字的长度
        for(int j = i + 1; n - j >= i && n - j >= j-i; j++){
            if(nums[i] == '0' && j - i > 1) break;
            long num1 = Long.parseLong(num.substring(0,i));
            long num2 = Long.parseLong(num.substring(i,j));
            String subnum = num.substring(j);
            if(isAdditive(subnum,num1,num2)) return true;
        }
    }
    return false;
}

static public boolean isAdditive(String subnum, long num1, long num2){
    //极限情况,subnum是空字符串,说明整个字符串已完成检测,返回ture
    if(subnum.equals("")) return true;
    //一般情况都进行以下操作
    long sum = num1 + num2;
    String sumstr = ((Long)sum).toString();
    if(!subnum.startsWith(sumstr)) return false;
    //非极限情况的返回
    return isAdditive(subnum.substring(sumstr.length()),num2,sum);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值