leetcode:累加数

题目来源:力扣

题目介绍:

累加数是一个字符串,组成它的数字可以形成累加序列。
一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。
给定一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是累加数。
说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
====================================
示例 1:
输入: “112358”
输出: true
解释: 累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
示例 2:
输入: “199100199”
输出: true
解释: 累加序列为: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199
====================================

审题:

刚看到这道题,有点懵,后来在纸上写写画画,发现只要确定前两个数值,当前字符串的累加序列便也就唯一确定了,我们只需要判断该序列是否符合累加值要求.
判断一个序列是否符合累加值也较为简单,此处主要注意的是如果整数过大,使用int保存两数之和可能溢出,我在后面的实现中使用了Long来保存整数,但最安全的方法应当是使用字符串相加的方式计算两个大整数之和.
如果当前剩余字符串为空,判断完毕,则当前序列为累加序列,如果当前值a与值b相加的整数对应字符串长度大于剩余的字符串,则返回false, 如果当前值a与值b相加整数对应的字符串与值b的后续子字符串对应,则比较下一位.

java算法:

class Solution {
    //确定前两个数字的可能值
    private boolean dfs(String num, int aStart, int aEnd, int bEnd){
        if(bEnd == num.length())
            return true;
        long first = Long.parseLong(num.substring(aStart, aEnd));
        long second = Long.parseLong(num.substring(aEnd, bEnd));
        String third = Long.toString(first + second);
        
        if(third.length() > num.length() - bEnd) //如果剩余长度不足third长度,则返回false
            return false;
        else if(num.substring(bEnd, bEnd+third.length()).equals(third)) //如果相等,则继续下一步比较
            return dfs(num, aEnd, bEnd, bEnd+third.length());
        else{
            return false;
        }
    }

    private boolean judge(String num, int aStart, int aEnd, int bEnd){
        while(bEnd < num.length()){
            long first = Long.parseLong(num.substring(aStart, aEnd));
            long second = Long.parseLong(num.substring(aEnd, bEnd));
            String third = Long.toString(first + second);
        
            if(third.length() > num.length() - bEnd) //如果剩余长度不足third长度,则返回false
            return false;
            else if(num.substring(bEnd, bEnd+third.length()).equals(third)){
                //如果相等,则继续下一步比较
                aStart = aEnd;
                aEnd = bEnd;
                bEnd = bEnd +third.length();
            }
            else //比较不相同
                return false;
        }
        return true;
    }

    public boolean isAdditiveNumber(String num) {
        for(int i = 1; i <= num.length() - 2; i++){
            for(int j = 1; j <= num.length() - i - 1 ; j++){
                if(num.charAt(0) == '0' && i > 1)
                    continue;
                if(num.charAt(i) == '0' && j > 1)
                    continue;
                if(judge(num, 0, i, i+j))
                    return true;
            }
        }
        return false;
    }
}

注:
dfs()函数为递归地判断一个字符串是否是累加字符串的方法,由于该递归为尾递归,因此可容易地转化为迭代方法judge()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值