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 ...
 
随机推荐
- net core (上)
			
net core (上) 本文是基于Windows10的. 下载地址: https://code.visualstudio.com/ insider 版下载地址: https://code.visua ...
 - 054 Spiral Matrix 旋转打印矩阵
			
给出一个 m x n 的矩阵(m 行, n 列),请按照顺时针螺旋顺序返回元素.例如,给出以下矩阵:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]应该返回 [1,2, ...
 - BI的意义
			
BI系统建设的价值,有可能不值钱,也有可能价值数千万,就看我们大家好用了没.”所以,BI系统建设的收获,终究还是因企业而异的,再归根,便是与企业的文化,与企业的人,尤其是管理层是极为相关的了. 商业智 ...
 - Spark Mllib里决策树二元分类使用.areaUnderROC方法计算出以AUC来评估模型的准确率和决策树多元分类使用.precision方法以precision来评估模型的准确率(图文详解)
			
不多说,直接上干货! Spark Mllib里决策树二元分类使用.areaUnderROC方法计算出以AUC来评估模型的准确率 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的 ...
 - MySQL存储过程多条修改语句
			
DROP procedure Sel_Function_ActivityPastDueDELIMITER $$DROP procedure IF EXISTS`shouyi`.`Sel_Functio ...
 - 使用CRA开发的基于React的UI组件发布到内网NPM上去
			
前言:构建的ES组件使用CNPM发布内网上过程 1. 使用Create-React-APP开的组件 如果直接上传到NPM,你引用的时候会报: You may need an appropriate l ...
 - @PropertySource
			
功能 加载指定的属性文件(*.properties)到 Spring 的 Environment 中.可以配合 @Value 和 @ConfigurationProperties 使用. @Prope ...
 - RK3288开发过程中遇到的问题点和解决方法之Framework
			
删除小电池图标及百分比 a.SystemUI/.../statusbar/policy/BatteryController.java mBatteryPercentageView.setVisibil ...
 - awk对列求和
			
awk 'BEGIN{total=0}{total+=$1}END{print total}' 文件名
 - 清理winsxs文件夹(系统更新文件)的第三方工具
			
工具名称(第三方): Windows Update Clean Tool 下载地址: http://www.xiazaiba.com/html/24145.html http://dx5.xiazai ...