LeetCode 306. Additive Number
来源:互联网 发布:淘宝退款诈骗 借贷 编辑:程序博客网 时间:2024/05/22 13:30
原题地址
题目大意:
给出一串由数字组成的字符串num,如”112358”,判断字符串是否存在如同:1,1,2,3,5,8的分解,使得每一个数等于前两个分解出的数的和。
1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8;
解题思路:
本题需要注意的地方是要使用大数加法进行运算,以及关于0的判断,当分解出的数以0开头并且长度不为1时为无效的分解。
使用递归的思想,将每一步分解出的数传到下一步进行判断即可得出结果。
解题代码:
测试代码:
#include <iostream>#define TEN '1' + '9' - '0'using namespace std;//大数加法 string Add(string a, string b){ int lena = a.length(); int lenb = b.length(); int carry = 0; string ret = ""; int i = lena - 1, j = lenb - 1; for(;i >= 0 && j >= 0; i--, j--){ //两个数从最后一位开始相加 int tmp = a[i] + b[j] + carry - '0'; carry = 0; //进位 if(tmp >= TEN) { //判断相加是否大于10 carry = 1; tmp = tmp - 10; } ret = char(tmp) + ret; } while(i >= 0){ int tmp = a[i] + carry; carry = 0; if(tmp >= TEN) { carry = 1; tmp -= 10; } ret = char(tmp) + ret; i--; } while(j >= 0){ int tmp = b[j] + carry; carry = 0; if(tmp >= TEN) { carry = 1; tmp -= 10; } ret = char(tmp) + ret; j--; } if(carry == 1){ //进位 ret = '1' + ret; } return ret;}bool judge(string num1, string num2, string subnum){ if(num1[0] == '0' && num1.length() != 1 || num2[0] == '0' && num2.length() != 1) return false; //开头为0,且长度不为1的分解是无效的 string sum = Add(num1, num2); int len = subnum.length(); int flag = 0; //判断是否存在等于前两个数之和的分解 for(int i = 1; i <= len; i++){ if(subnum.substr(0, i) == sum) { flag = i; //记录分解位置 break; } } if(!flag) return false; string num3 = subnum.substr(0, flag); subnum = subnum.substr(flag, len - flag); if(flag == len) return true; else return judge(num2, num3, subnum); //递归搜索 }bool isAdditiveNumber(string num){ int len = num.size(); for(int i = 1; i < len; i++){ string num1 = num.substr(0,i); //分解出第一个数 for(int j = 1; j < len - i; j++){ string num2 = num.substr(i,j); //分解出第二个数 string subnum = num.substr(i + j, len - i - j); //剩下的串 if(subnum == "") continue; else if(judge(num1, num2, subnum)) return true; } } return false;}int main(){ string num = "101"; if(isAdditiveNumber(num)) cout << "yes" << endl; else cout << "no" << endl;}
提交代码:
int TEN='1' + '9' - '0'; string Add(string a, string b){ int lena = a.length(); int lenb = b.length(); int carry = 0; string ret = ""; int i = lena - 1, j = lenb - 1; for(;i >= 0 && j >= 0; i--, j--){ //两个数从最后一位开始相加 int tmp = a[i] + b[j] + carry - '0'; carry = 0; //进位 if(tmp >= TEN) { //判断相加是否大于10 carry = 1; tmp = tmp - 10; } ret = char(tmp) + ret; } while(i >= 0){ int tmp = a[i] + carry; carry = 0; if(tmp >= TEN) { carry = 1; tmp -= 10; } ret = char(tmp) + ret; i--; } while(j >= 0){ int tmp = b[j] + carry; carry = 0; if(tmp >= TEN) { carry = 1; tmp -= 10; } ret = char(tmp) + ret; j--; } if(carry == 1){ //进位 ret = '1' + ret; } return ret;}bool judge(string num1, string num2, string subnum){ if(num1[0] == '0' && num1.length() != 1 || num2[0] == '0' && num2.length() != 1) return false; //开头为0,且长度不为1的分解是无效的 string sum = Add(num1, num2); int len = subnum.length(); int flag = 0; //判断是否存在等于前两个数之和的分解 for(int i = 1; i <= len; i++){ if(subnum.substr(0, i) == sum) { flag = i; //记录分解位置 break; } } if(!flag) return false; string num3 = subnum.substr(0, flag); subnum = subnum.substr(flag, len - flag); if(flag == len) return true; else return judge(num2, num3, subnum); //递归搜索 }bool isAdditiveNumber(string num){ int len = num.size(); for(int i = 1; i < len; i++){ string num1 = num.substr(0,i); //分解出第一个数 for(int j = 1; j < len - i; j++){ string num2 = num.substr(i,j); //分解出第二个数 string subnum = num.substr(i + j, len - i - j); //剩下的串 if(subnum == "") continue; else if(judge(num1, num2, subnum)) return true; } } return false;}
0 0
- [leetcode] 306. Additive Number
- [LeetCode]306. Additive Number
- LeetCode:306. Additive Number
- leetcode 306. Additive Number
- 306. Additive Number LeetCode
- LeetCode *** 306. Additive Number
- LeetCode 306. Additive Number
- [LeetCode]--306. Additive Number
- [leetcode] 306. Additive Number
- 【LeetCode】306. Additive Number
- leetcode 306. Additive Number
- [LeetCode]306. Additive Number
- LeetCode 306. Additive Number
- leetcode 306. Additive Number
- [leetcode]306. Additive Number
- leetcode 306. Additive Number
- (Java)LeetCode-306. Additive Number
- [leetcode] 306. Additive Number 解题报告
- 解决linmysqlclient.so.16缺失问题
- mysql_IF
- DEV,C-FREE等编译器最后一行字
- 拉丁方阵、打印菱形(实心or空心)
- Vim_操作笔记
- LeetCode 306. Additive Number
- Mysql_101个调节和优化的提示
- 欢迎使用CSDN-markdown编辑器
- Js_数组的操作
- Js_数组的操作
- Bubble Rabbit Privacy Policy
- Jquery_获取、改变元素属性值
- array转xml 互换
- 用GDB调试程序(四)