题目描述:
Additive number is a string whose digits can formadditive sequence.
A valid additive sequence should contain at least threenumbers. Except for the first two numbers, each subsequent number in thesequence must be the sum of the preceding two.
For example:
"112358" is an additive number because thedigits 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, theadditive sequence is: 1, 99, 100, 199.
1 + 99 = 100, 99 + 100 = 199
Note: Numbersin 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 afunction to determine if it's an additive number.
Follow up:
How would you handle overflow for very large input integers?
给定一个由0至9数字组成的字符串,判断它是否满足从第三个数字开始,每个数字都等于前两个数字之和;02这样的数字是非法的;考虑如何解决整数溢出问题。
我的分析:
1. 只要选定了第一个数子和第二个数字,后面可以用相同的模式判断每一个数字是否等于前两个数字之和;
2. 这种相同的模式用递归实现,详情见代码
3. String.substring(int beginIndex, intendIndex) 左闭右开;
4. 只需判断判断第一个数字和第二个数字是否出现01,023,0654等这样的数字;
5. 用双层for循环选择第一个数字和第二个数字;
6. 第一个数字的长度一定小于字符串长度的一半(无论长度是奇数或者偶数,这一规则都可以成立),因为第三个数字一定大于等于第一个数字;
7. 第二个数字的长度最大值也存在,保证第三个数字的长度>=第一个数字长度和第二个数字长度;
8. 用long型解决大整数的溢出问题
我的解答:
static public boolean isAdditiveNumber(String num) {
char[] nums = num.toCharArray();
int n = num.length();
//选择第一个数字first,这里i表示第一个数字结束的位置(结束位置在区间中是开的),也是第一个数字的长度
for(int i = 1; i <= n / 2; i++){
if(nums[0] == '0' && i > 1) break;
//选择第二个数字second,这里j表示第二数字结束的位置(结束位置在区间中是开的),j-i是第二个数字的长度
for(int j = i + 1; n - j >= i && n - j >= j-i; j++){
if(nums[i] == '0' && j - i > 1) break;
long num1 = Long.parseLong(num.substring(0,i));
long num2 = Long.parseLong(num.substring(i,j));
String subnum = num.substring(j);
if(isAdditive(subnum,num1,num2)) return true;
}
}
return false;
}
static public boolean isAdditive(String subnum, long num1, long num2){
//极限情况,subnum是空字符串,说明整个字符串已完成检测,返回ture
if(subnum.equals("")) return true;
//一般情况都进行以下操作
long sum = num1 + num2;
String sumstr = ((Long)sum).toString();
if(!subnum.startsWith(sumstr)) return false;
//非极限情况的返回
return isAdditive(subnum.substring(sumstr.length()),num2,sum);
}