leetcode 1月10日每日一题 306. 累加数
Posted 嗯我想想
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 1月10日每日一题 306. 累加数相关的知识,希望对你有一定的参考价值。
306. 累加数
思路分析:
枚举第一个数和第二个数,高精度加法算出第三个数,然后进行比较
AC代码:
// C++
class Solution
public:
// 高精度加法板子
string add(string x, string y)
vector<int> A, B, C;![请添加图片描述](https://img-blog.csdnimg.cn/d5eaa9b0fe2e4870ba30d7c7c01419a6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Zev5oiR5oOz5oOz,size_20,color_FFFFFF,t_70,g_se,x_16)
// 先将 x,y 反向存入 vector
for(int i = x.size() - 1; i >= 0; i--) A.push_back(x[i] - '0');
for(int i = y.size() - 1; i >= 0; i--) B.push_back(y[i] - '0');
// 模拟加法开始
for(int i = 0, t = 0; i < A.size() || i < B.size() || t; i++)
if(i < A.size()) t += A[i];
if(i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
string z;
for(int i = C.size() - 1; i >=0; i--) z += to_string(C[i]);
return z;
bool isAdditiveNumber(string num)
for(int i = 0; i < num.size(); i++)
for(int j = i + 1; j + 1 < num.size(); j++)
// 第一个数 a+1 到 b
// 第二个数 b+1 到 c
// 第三个数 c+1 到 ...
// 所以a的初值从 -1 开始
int a = -1, b = i, c = j;
while(true)
if((b - a > 1 && num[a + 1] == '0') || (c - b > 1 && num[b + 1] == '0')) break; // 有前导0 不合法
auto x = num.substr(a + 1, b - a), y = num.substr(b + 1, c - b);
auto z = add(x, y);
if(num.substr(c + 1, z.size()) != z) break;
a = b, b = c, c += z.size();
if(c + 1 == num.size()) return true;
return false;
;
以上是关于leetcode 1月10日每日一题 306. 累加数的主要内容,如果未能解决你的问题,请参考以下文章
leetcode 1月13日每日一题 747. 至少是其他数字两倍的最大数
leetcode 1月9日每日一题 1629. 按键持续时间最长的键
leetcode 1月9日每日一题 1629. 按键持续时间最长的键
leetcode 1月12日每日一题 334. 递增的三元子序列