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.
Follow up:
How would you handle overflow for very large input integers?
链接: http://leetcode.com/problems/additive-number/
题解:
求String是否是additive number。这里我们要用到递归。就是先取第一个单词和第二个单词,求出sum,再跟剩下字符串的首部进行比较,然后进行递归。还有很多pruning可以做,比如取num1和num2时只用遍历一半的字符,因为假如这两个的和超过了字符串长的一半,肯定不符合规定。 二刷要注意精炼代码。
Time Complexity - O(2n), Space Complexity - O(2n)
public class Solution {
public boolean isAdditiveNumber(String num) {
if(num == null || num.length() == 0) {
return false;
}
for(int i = 1; i < num.length(); i++) {
for(int j = i + 1; j < num.length(); j++) {
String s1 = num.substring(0, i);
String s2 = num.substring(i, j);
if(isAdditiveNumber(s1, s2, num.substring(j))) {
return true;
}
}
}
return false;
}
private boolean isAdditiveNumber(String s1, String s2, String num) {
if(num.length() == 0) {
return true;
}
if((s1.length() > 1 && s1.charAt(0) == '0') || (s2.length() > 1 && s2.charAt(0) == '0')) {
return false;
}
String sum = getSum(s1, s2);
if(sum.length() > num.length() || !sum.equals(num.substring(0, sum.length()))) {
return false;
} else {
return isAdditiveNumber(s2, sum, num.substring(sum.length()));
}
}
public String getSum(String s1, String s2) {
StringBuilder sb = new StringBuilder();
int index1 = s1.length() - 1, index2 = s2.length() - 1;
int carry = 0, newDigit = 0;
while(index1 >= 0 || index2 >= 0) {
int digitA = index1 >= 0 ? s1.charAt(index1) - '0' : 0;
int digitB = index2 >= 0 ? s2.charAt(index2) - '0' : 0;
newDigit = (digitA + digitB + carry) % 10;
sb.insert(0, newDigit);
carry = (digitA + digitB + carry) >= 10 ? 1 : 0;
index1--;
index2--;
}
if(carry == 1) {
sb.insert(0, '1');
}
return sb.toString();
}
}
题外话:
今天家里修理gas range,修了一天,所以只做了一道题。修理工是一个多米尼加人,最后做的不太好,还要了$700,好气人啊....明天去吃Hakata Tonton,希望能在图书馆多做几道题目。
Reference:
https://leetcode.com/discuss/70124/0ms-concise-solution-perfectly-handles-the-follow-leading
https://leetcode.com/discuss/70102/java-recursive-and-iterative-solutions
https://leetcode.com/discuss/70119/backtracking-with-pruning-java-solution-and-python-solution
https://leetcode.com/discuss/71455/very-straightforward-solution-with-detailed-explanation
https://leetcode.com/discuss/70157/java-easy-understand-dfs
https://leetcode.com/discuss/70089/python-solution
https://leetcode.com/discuss/70796/simple-java-solution
https://leetcode.com/discuss/70123/my-simple-c-non-recursion-solution
https://leetcode.com/discuss/73387/elegant-0ms-backtracking-solution-in-c-with-explanation
306. Additive Number的更多相关文章
- [LeetCode] 306. Additive Number [Medium]
306. Additive Number class Solution { private: string stringAddition(string &a, string &b) { ...
- 【LeetCode】306. Additive Number 解题报告(Python)
[LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...
- Leetcode 306. Additive Number
Additive number is a string whose digits can form additive sequence. A valid additive sequence shoul ...
- 【LeetCode】306. Additive Number
题目: Additive number is a string whose digits can form additive sequence. A valid additive sequence s ...
- 306 Additive Number 加法数
Additive number is a string whose digits can form additive sequence.A valid additive sequence should ...
- 【刷题-LeetCode】306. Additive Number
Additive Number Additive number is a string whose digits can form additive sequence. A valid additiv ...
- LeetCode(306) Additive Number
题目 Additive number is a string whose digits can form additive sequence. A valid additive sequence sh ...
- [LeetCode] Additive Number 加法数
Additive number is a positive integer whose digits can form additive sequence. A valid additive sequ ...
- Additive Number
Additive number is a string whose digits can form additive sequence. A valid additive sequence shoul ...
随机推荐
- multiple backgrounds
multiple backgrounds 多重背景,也就是CSS2里background的属性外加origin.clip和size组成的新background的多次叠加,缩写时为用逗号隔开的每组值:用 ...
- Careercup - Google面试题 - 6283958983589888
2014-05-06 11:31 题目链接 原题: Find the k-th Smallest Element in Two Sorted Arrays. I followed the algori ...
- 【Binary Tree Maximum Path Sum】cpp
题目: Given a binary tree, find the maximum path sum. The path may start and end at any node in the tr ...
- 浅谈GitHub
Git 是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub. Gith是一个基于 git 的社会化代码分享社区,所谓 social coding.你 ...
- BZOJ 3223 文艺平衡树 [codevs3303翻转区间]
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3223 通道2:http://codevs.cn/problem/3303/ 题目分析: 我 ...
- RabbitMQ 3.6 安装
1. 首先安装这个 http://www.erlang.org/downloads 2. 再安装这个 http://www.rabbitmq.com/install-windows.html 3. 添 ...
- tomcat集群 (自带Cluster集群)
不用借助其他任何工具,tomcat自身就可以实现session共享,实现集群.以下为大概步骤 1,如果是在同一台机器上,请保持多个tomcat端口(一个tomcat对应三个端口)不相同:如果是不同机器 ...
- Swift-6-函数
// Playground - noun: a place where people can play import UIKit // 定义和调用函数 func sayHello(personName ...
- IBatis 常用XML
<select id="GetInfo"> <![CDATA[ select * from vi_WaterStation ]]> <dynami ...
- Hadoop发行版本介绍
前言 从2011年开始,中国进入大数据风起云涌的时代,以Hadoop为代表的家族软件,占据了大数据处理的广阔地盘.开源界及厂商,所有数据软件,无一不向Hadoop靠拢.Hadoop也从小众的高富帅领域 ...