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

關(guān)鍵在于找出前兩個數(shù),后面的數(shù)則可以依次做對比。
對前兩個數(shù)進行枚舉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 專心只做一件對的事 有時候走在街上看見一輛好車,就忍不住好奇,這些人都是怎么做到的?他們用什么方式賺...
    飄渺_d65f閱讀 406評論 -4 9
  • 酒泉 那清冷的 不是冬夜是春風(fēng) 那潔白的 不是明月是思愁 我一點點拾起 歲月不留一...
    薛子沐閱讀 266評論 0 3
  • 項目編號:SCP-1024-懺悔室 項目等級:Safe 收容措施:單獨放置于500mX500mx500M見方的地下...
    山桃閱讀 679評論 0 3
  • 而今人人自危,“聰明者”很痛苦,他分明看見前途渺茫;“愚笨者”很不堪,他即使勤勤懇懇,也改變不了拮據(jù)。 強烈的焦慮...
    汶原閱讀 308評論 0 1