306. additive-number

          这道题个人感觉难度还是挺大的,一开始一直在想有什么简单的方法来解决,但是,似乎找不到比O(N^2)更小的方法,如果有更好的方法,希望大家不吝赐教。其实这道题有几个问题比较关键,第一个,字符串转换成数字进行计算,最终要判断字符串是否满足斐波那契数列。 第二个,剔除非法字符情况,第三,字符串可以很长,但是int数字的最大位数是固定的。

           题目大体意思是:给定一个字符串,判断这个字符串是否有一种情况能满足如同Fibonacci的递增模式(因为没有负数的情况)。

           我的思路是,首先两个数分别用来表示初始两个数的和,只要找到初始的两个数,后面的数都是自然而然的,比如,刚开始找到的数是1,1,那么其后只能是2,3,5,8……这样的情况才能满足条件。而我们只要判断我们计算结果和原始串是否匹配就行,如果不匹配,就继续其他初始情况,直到找到合适的位置。

           具体的实现思路,首先用第一层循环找到第一个数,用第二层循环找到第二个数,判断此时的数是否合法,即不会出现01,04这样的情况;   第二、如果两个数合法,就计算这两个数的加和所组成的字符串和源字符串中对应位置的字符串是否相同,如果相同,就将结果加在另一个字符串中,如果出现不相等,则停止搜索,进入下一种情况的遍历。

具体的AC代码:

class Solution {
public:
    bool isAdditiveNumber(string num) {
        for (int i=1; i<num.size(); ++i) {
            for (int j=i+1; j<num.size(); ++j) {
                string s1 = num.substr(0, i);
                string s2 = num.substr(i, j-i);
                if (s1.size()>1 && s1[0]=='0' || s2.size()>1 && s2[0]=='0') {
                     continue;
                }
                long long d1 = stol(s1), d2 = stol(s2);
                long long next = 0;
                string res = s1+s2;
                while (res.size() < num.size()) {
                    next = d1+d2;
                    d1 = d2;
                    d2 = next;
                    string nexts = to_string(next);
                    if (nexts == num.substr(res.size(), nexts.size())) {
                        res += (to_string(next));
                    } else {
                        break;
                    }
                }
                if (num == res) {
                    return 1;
                }
            }
        }
        return 0;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值