一、题目描述

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

一个有效的累加序列必须至少包含 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

二、题目分析

1)情况非常多,采用回溯的方法
2)特殊情况:以0为开头的非零整数;特大数long  long

3)具体解析请看代码注释

三、实现代码

 1 class Solution {
 2 public:
 3     bool isAdditiveNumber(string num) {
 4         int n = num.size();
 5         if (n < 3)return false;
 6         long long ppre = 0, pre = 0;
 7         //找出第一个数和第二个数
 8         for (int i = 1; i <= n / 2; ++i) {//第一个数的长度不能超过n/2
 9             ppre = stoi(num.substr(0, i));
10             for (int j = 1; i + j <= (n * 2) / 3; ++j) {//第一个和第二个数总的长度不能超过2/3
11                 pre = stoi(num.substr(i, j));//从位置i开始截取
12                 if (dfs(i + j, max(i, j), pre, ppre, num))return true;//第二个数不一定比第一个数大
13             }
14         }
15         return false;
16     }
17 private:
18     /**
19     * 计算当前的数是不是前两个数的和
20     * pos代表当前指针达到的位置
21     * len代表要截取的长度
22     * pre代表前面的数
23     * ppre代表前一个的前一个数
24     * s代表字符串
25     */
26     bool dfs(int pos, int len, long long pre, long long ppre, string &s) {
27         int n = s.size();
28         if (pos == n)return true;//已经计算到最后了
29         bool flag = false;
30         long long cur = 0;
31         for (int i = len; pos + i <= n; ++i) {
32             cur = stoi(s.substr(pos, i));
33             if (cur > pre + ppre)break;//当前的数大于两者之和,就跳出循环,不能再截取更长的长度了
34             if (cur < pre + ppre)continue;//如果当前的数小于两者之和,就截取更长的一位
35             flag = dfs(pos + i, i, cur, pre, s);//对当前来说两者相等,继续检验,下一次的开始长度至少和前面一个一样
36             if (flag)break;//只要找到一个,就可以跳出了
37         }
38         return flag;
39     }
40     /**
41     * 把字符串转换成整数
42     */
43     long long stoi(const string &s) {
44         if (s.size() > 1 && s[0] == '0')return -1;
45         stringstream ss(s);
46         long long res;
47         ss >> res;
48         return res;
49     }
50
51 };

需要注意的地方有:第8行和第10行的等号;第43行的const

转载于:https://www.cnblogs.com/zhizhiyu/p/10190438.html

[Leetcode] 第306题 累加数相关推荐

  1. Python|Leetcode《306》|累加数

    专栏<LeetCode|一刷到底> 打卡每天leetcode精选每日一题(尽量不断更!) 点击关注不迷路!!! 一.题目描述 题目:累加数 难度:中等 地址:<306>累加数 ...

  2. Java实现 LeetCode 306 累加数

    306. 累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 ...

  3. leetcode 306 累加数(js)

    题目描述 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0' ...

  4. LeetCode每日一题(22年1月7日-1月16日)

    目录(每日一题) 1614. 括号的最大嵌套深度 89. 格雷编码 1629. 按键持续时间最长的键 306. 累加数 1036. 逃离大迷宫 334. 递增的三元子序列 747. 至少是其他数字两倍 ...

  5. 编写一个函数实现从 1 到 n 共 n 个数的累加_leetcode306_go_累加数

    题目 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0'-' ...

  6. 累加数Python解法

    累加数 是一个字符串,组成它的数字可以形成累加序列. 一个有效的 累加序列 必须 至少 包含 3 个数.除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和. 给你一个只包含数字 '0 ...

  7. LeetCode第7题:整数反转

    生命无罪,健康万岁,我是laity. 我曾七次鄙视自己的灵魂: 第一次,当它本可进取时,却故作谦卑: 第二次,当它在空虚时,用爱欲来填充: 第三次,在困难和容易之间,它选择了容易: 第四次,它犯了错, ...

  8. 【Leetcode】 刷题之路1(python)

    leetcode 刷题之路1(python) 看到有大佬总结了一些相关题目,想着先刷一类. 1.两数之和 15.三数之和 16.最接近的三数之和 11.盛最多的水 18.四数之和 454.四数相加II ...

  9. 15.使用一样的BFS方法(代码几乎一模一样)解决多道LeetCode题目--542题(01矩阵)1765题(地图中的最高点)994腐烂的橘子

    一.综述 本文总结自己刷LeetCode中遇到的使用BFS方法解决相同类型的题目.(代码几乎是一模一样) 二.01矩阵(LeetCode第542题) class Solution {int[][] d ...

最新文章

  1. java基础知识一_Java基础知识(一)
  2. 动态规划——最优买卖股票时机含冷冻期(Leetcode 309)
  3. mysql云上迁移_自建mysql 迁移到云上-问答-阿里云开发者社区-阿里云
  4. 关于stack 和heap
  5. SpringBoot+JSON+AJAX+ECharts+Fiddler实现前后端分离开发可视化(进阶篇)
  6. idea2017+kemulator搭建J2ME开发环境
  7. 吉林省辽源市谷歌高清卫星地图下载
  8. 二乘二(二阶)魔方教程,看完教程拼不出来我给你钱!
  9. mysql binlog 回滚_Mysql误操作后利用binlog2sql快速回滚的方法详解
  10. 教你如何设计ASP网上考试系统
  11. Postgresql语句持续更新
  12. 计算机考研失败了还能找工作吗,考研失败了怎么办_考研失败还能找工作吗
  13. 实现HTML转PDF 多个PDF合并
  14. mos管的rc吸收电路计算_一种反激式开关电源中MOS管的RC吸收电路的制作方法
  15. Python读取Word文档内容
  16. 活动运营5步走,打造一场完满的线下活动
  17. 电商上行大势已定,店宝宝扶持新手开展网店创业
  18. LD3320和MP3模块搭建语音识别交互系统
  19. php中push数组,php中的array_push函数怎么用
  20. 程序员也需要这种魄力

热门文章

  1. E-MapReduce结合DataV进行数据展现
  2. Direct2D (19) : 图层之 TD2D1LayerParameters.geometricMask (使用几何图形剪裁图层)
  3. loadrunner脚本中参数有中文时报错
  4. 关于ie6下提交上传表单的注意事项
  5. Aix5.3安装Bash环境
  6. 玻璃体混浊不要转眼球
  7. 2021年4月12日-民航上海医院-瑞金医院古北分院-检查报告单
  8. Cannot resolve field [product], input field list:[user, EXPR$0]
  9. apt update无法连接上 127.0.0.1:10808
  10. 统计dataframe中所有列的null数量与填充null注意事项