LeetCode-306 累加数

简介: LeetCode-306 累加数

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/additive-number

题目描述

累加数 是一个字符串,组成它的数字可以形成累加序列。

一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和。

给你一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。

说明:累加序列里的数,除数字 0 之外,不会 以 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
提示:
1 <= num.length <= 35
num 仅由数字(0 - 9)组成

 

进阶:你计划如何处理由过大的整数输入导致的溢出?

解题思路

本题核心思想是,确定了前两个数便可以确定整个序列的数。考虑到数字规模仅仅35,所以可以暴力枚举所有前两个数,并判断后续数字是否满足累加数。

首先外循环,循环枚举不同长度的前两个数,这里可以优化的点是如果第一个数的长度超过了整个序列容量的一半,那么就不必枚举下去了,因为一个大数加上任何非负数,都不会减小,所以位数肯定不会变少。

确定了前两个数的位数,便可以依次判断后续的数是否满足累加数的定义,为了兼容过大的整数,在这里我使用了逆序字符串相加求和的方法代替了整数求和。

首先将前两个数提取出来,注意,这两个数的存储形式是逆序存储的,也就是将123存放为321,这样是由于求和操作是从低位相加会比较方便计算。顺便判断这两个数是否为0开头,如果是0开头并且不为0,那么根据题意并不符合累加数。

接着进行两数求和,注意进位的问题,并且如果求和结束后还有溢出需要再增加一位。判断剩余的序列长度是否比和的长度长,如果不满足,那么就没必要判断了,肯定不符合累加数,接着从和的尾部依次与剩余序列进行匹配,如果不相同,那么就不为累加数。最终如果满足所有的条件,那么就是累加数。

 

代码展示

 

class Solution {
public:
    bool check(int iIndex1, int iIndex2, const string &num)
    {
        int iIndex3 = iIndex2 + 1;
        string strNum1, strNum2, strSum;
        for (int i = iIndex1; i >= 0; i--)
        {
            strNum1.push_back(num[i]);
        }
        if (strNum1.size() != 1 && strNum1[strNum1.size() - 1] == '0')
            return false;
        for (int i = iIndex2; i > iIndex1; i--)
        {
            strNum2.push_back(num[i]);
        }
        if (strNum2.size() != 1 && strNum2[strNum2.size() - 1] == '0')
            return false;
        while (iIndex3 < num.size())
        {
            int iFlag = 0;
            for (int i = 0; i < max(strNum1.size(), strNum2.size()); i++)
            {
                int iSum = (i < strNum1.size() ? strNum1[i] - '0' : 0) + (i < strNum2.size() ? strNum2[i] - '0' : 0) + iFlag;
                iFlag = iSum / 10;
                strSum.push_back(iSum % 10 + '0');
            }
            if (iFlag)
                strSum.push_back(iFlag + '0');
            if (num.size() - iIndex3 < strSum.size())
                return false;
            for (int i = strSum.size() - 1; i >= 0; i--)
            {
                if (strSum[i] != num[iIndex3])
                    return false;
                iIndex3++;
            }
            strNum1 = strNum2;
            strNum2 = strSum;
            strSum.clear();
        }
        return true;
    }
    bool isAdditiveNumber(string num) {
        for (int i = 0; i <= num.size() / 2; i++)
        {
            for (int j = i + 1; j < num.size() - 1; j++)
            {
                if (check(i, j, num))
                {
                    return true;
                }
            }
        }
        return false;
    }
};

运行结果

 

相关文章
|
7月前
|
算法
leetcode-306:累加数
leetcode-306:累加数
33 0
|
算法
LeetCode 306.累加数
LeetCode 306.累加数
58 0
|
算法 Python
Python|Leetcode《306》|累加数
Python|Leetcode《306》|累加数
Leetcode306累加数(递归解决)
Leetcode306累加数(递归解决)
112 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
62 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
124 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
41 1
|
3月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
4月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
71 7