306. Additive Number

Question

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.
For example:
"112358" is an additive number because 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
"199100199" is also an additive number, the additive sequence is: 1, 99, 100, 199.
1 + 99 = 100, 99 + 100 = 199

Note: Numbers in 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 a function to determine if it's an additive number.
Follow up:
How would you handle overflow for very large input integers?


Code

public class Solution {
    public boolean isAdditiveNumber(String num) {
        if (num == null || num.length() == 0) return false;

        for (int i = 1; i < num.length() / 2 + 1; i++) {
            for (int j = i + 1; j <= num.length() && j - i <= num.length() / 2 + 1; j++) {
                String s1 = num.substring(0, i);
                String s2 = num.substring(i, j);
                if ((s1.charAt(0) == '0' && s1.length() > 1) || (s2.charAt(0) == '0' && s2.length() > 1)) continue;
                long i1 = Long.parseLong(s1);
                long i2 = Long.parseLong(s2);
                long sum = i1 + i2;
                int flag = 0;
                int k = j;
                while (k + String.valueOf(sum).length() <= num.length()) {
                    long i3 = Long.parseLong(num.substring(k, k + String.valueOf(sum).length()));
                    if (i3 == sum) {
                        i1 = i2;
                        i2 = i3;
                        k += String.valueOf(sum).length();
                        sum = i1 + i2;
                        flag = 1;
                    } else {
                        flag = 2;
                        break;
                    }
                }
                if (flag == 1) return true;
            }
        }
        return false;
    }
}

Solution

关键在于找出前两个数,后面的数则可以依次做对比。
对前两个数进行枚举。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 专心只做一件对的事 有时候走在街上看见一辆好车,就忍不住好奇,这些人都是怎么做到的?他们用什么方式赚...
    飘渺_d65f阅读 419评论 -4 9
  • 酒泉 那清冷的 不是冬夜是春风 那洁白的 不是明月是思愁 我一点点拾起 岁月不留一...
    薛子沐阅读 271评论 0 3
  • 项目编号:SCP-1024-忏悔室 项目等级:Safe 收容措施:单独放置于500mX500mx500M见方的地下...
    山桃阅读 696评论 0 3
  • 而今人人自危,“聪明者”很痛苦,他分明看见前途渺茫;“愚笨者”很不堪,他即使勤勤恳恳,也改变不了拮据。 强烈的焦虑...
    汶原阅读 318评论 0 1