LeetCode(306) Additive Number
题目
Additive number is a string whose digits can form additive sequence.
A valid additive sequence should contain at least three numbers. Except for the first two numbers, each subsequent number in the sequence must be the sum of the preceding two.
For example:
“112358” is an additive number because the digits can form an additive sequence: 1, 1, 2, 3, 5, 8.
1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
“199100199” is also an additive number, the additive sequence is: 1, 99, 100, 199.
1 + 99 = 100, 99 + 100 = 199
Note: Numbers in the additive sequence cannot have leading zeros, so sequence 1, 2, 03 or 1, 02, 3 is invalid.
Given a string containing only digits ‘0’-‘9’, write a function to determine if it’s an additive number.
分析
给定一个字符串,题目要求判断该字符串是否为约束规则下的可加字符串。
手动判断很容易,但是转为程序实现开始不知从何入手。
查阅一些资料,最终搞定。详见代码。
AC代码
class Solution {
public:
bool isAdditiveNumber(string num) {
if (num.empty())
return false;
int len = num.size();
for (int i = 1; i < len - 1; ++i)
{
string a = num.substr(0, i);
//非首个以0开头的加数违反规则
if (a[0] == '0' && i > 1)
continue;
for (int j = 1; j < len; ++j)
{
string b = num.substr(i, j);
if (b[0] == 0 && j > 1)
continue;
string ret = add(a, b);
if (i + j + ret.length() > len)
continue;
//存储原字符串中和上一和 同样长度的子串
string val = num.substr(i + j, ret.length());
//当前已经相加的末尾下标
int pass = i + j;
string tmp;
while (ret == val)
{
//判断是否到字符串末尾
pass += val.length();
if (len == pass)
return true;
tmp = b;
b = ret;
//下一步骤加法实现
ret = add(tmp, b);
val = num.substr(pass, ret.length());
}//while
}//for
}//for
return false;
}
//字符串加法实现
string add(string a, string b)
{
int len_a = a.size(), len_b = b.size();
string ret = "";
int i = len_a - 1, j = len_b - 1, carry = 0;
while (i>=0 && j>=0)
{
int tmp = a[i] + b[j] - 2 * '0' + carry;
carry = tmp / 10;
char c = tmp % 10 + '0';
ret += c;
--i;
--j;
}//while
while (i >= 0)
{
int tmp = a[i] - '0' + carry;
carry = tmp / 10;
char c = tmp % 10 + '0';
ret += c;
--i;
}//while
while (j >= 0)
{
int tmp = b[j] - '0' + carry;
carry = tmp / 10;
char c = tmp % 10 + '0';
ret += c;
--j;
}//while
if (carry != 0)
ret += carry + '0';
reverse(ret.begin(), ret.end());
return ret;
}
};
LeetCode(306) Additive Number的更多相关文章
- LeetCode(137) Single Number II
题目 Given an array of integers, every element appears three times except for one. Find that single on ...
- LeetCode(202) Happy Number
题目 Write an algorithm to determine if a number is "happy". A happy number is a number defi ...
- LeetCode(65) Valid Number
题目 Validate if a given string is numeric. Some examples: "0" => true " 0.1 " ...
- LeetCode(260) Single Number III
题目 Given an array of numbers nums, in which exactly two elements appear only once and all the other ...
- LeetCode(268) Missing Number
题目 Given an array containing n distinct numbers taken from 0, 1, 2, -, n, find the one that is missi ...
- LeetCode(136) Single Number
题目 Given an array of integers, every element appears twice except for one. Find that single one. Not ...
- LeetCode(9)Palindrome Number
题目: Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could neg ...
- Leetcode(4)寻找两个有序数组的中位数
Leetcode(4)寻找两个有序数组的中位数 [题目表述]: 给定两个大小为 m 和 n 的有序数组 nums1 和* nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O( ...
- LeetCode(275)H-Index II
题目 Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimi ...
随机推荐
- 牛客网Java刷题知识点之关键字static、static成员变量、static成员方法、static代码块和static内部类
不多说,直接上干货! 牛客网Java刷题知识点之关键字static static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中st ...
- Ubuntu常用指令集
Ubuntu Linux 操作系统常用命令详细介绍 ( 1)Udo apt-get install 软件名 安装软件命令 sudo nautilus 打开文件(有 root 权限)su root 切换 ...
- c# 类名不同,字段相同,如何快速给类赋值
1,相关的两个类如下:现在我们知道短信的值,如何给微信来赋值呢,需要用到我们的反射,当然字段一一赋值也可以,但是如果字段有100个,这个方法就不行啦 /// <summary> /// 短 ...
- webpack分开打包和合并打包的瘦身
webpack.config.js 记录一下优化webpack的几个点: 1. devtool: false, //产品阶段不应该有devtool entry: { bundle : pa ...
- DOCKER启动失败Job for docker.service failed because the control process exited with error code. See "syste mctl status docker.service" and "journalctl -xe" for details.
[root@localhost ~]# systemctl start docker Job for docker.service failed because the control process ...
- 【Unity3D】魔鬼与牧师游戏记录——MVC架构
Priests and Devils是一款益智类的小游戏,需要在规定的时间内帮助牧师和魔鬼都安全过河.河边有三个魔鬼和三个牧师,他们都想过河,但河上只有一条船,这艘船每次只能搭载两个,而且必须有一个人 ...
- Elasticsearch-分片原理1
Elasticsearch版本:6.0 Elasticsearch基于Lucene,采用倒排索引写入磁盘,Lucene引入了按段搜索的概念,来动态更新索引. 一个Lucene索引包含一个提交点和三个短 ...
- 升级CentOS内核 - 2.6升级到3.10/最新内核
##记得切换到root用户执行升级操作. [root@localhost ~]# uname -a ##旧版 Linux localhost.localdomain 2.6.32-279.el6.i6 ...
- Delphi7使用二维码
参考:http://jingyan.baidu.com/article/e75057f2ad6481ebc81a897b.html 首先下载对应的 dll (已经上传到博客园文件) 然后就是Delph ...
- [windows]窗口文件夹中使用常见任务
文件夹中使用常见任务,如截图所示增加红色框部分. 设置步骤: 我的电脑--〉右键--〉属性--〉高级选项--〉性能设置--〉自定义:勾选在文件夹中使用常见任务.