改进版---字符串中数字子串的求和

【题目】
  给定一个字符串str,求其中全部数字串所代表的数字之和。
【原始要求】
  1、忽略小数点字符,例如"A1.3",其中包含两个数字1和3。
  2、如果紧贴数字子串的左侧出现字符’-‘,当连续出现的数量为奇数时,则数字为负数,连续出现的数量为偶数时,则数字为正数。例如,”A-1BC–12”,其中包含数字是-1和12。
【新增要求】
  1、考虑这种情况,”-12-a-2c—d6a”,其中包含的数字为-12,2,-6,返回值为-16。如果采用书中的原始代码思路,不能处理这种负号不连续的情况,所以对代码进行了改进。
【举例】
  str=”“,返回36;
  str=”a-1b–2c–d6e”,返回7;

class Transform {
public:
    int numSum(string str) {
        int len = str.length();
        if(len <= 0)        //当字符串不合法时返回0
            return 0;

        int num = 0;    //当前数字
        int sum = 0;    //总和
        int flag = 1;   //正负号

        for(int i = 0; i < len; ++i){
            if(str[i] == '-' ){
                flag *= -1;
            }
            else{
                if(str[i] <= '9' && str[i] >= '0'){
                        //当前字符为数字时,更新num
                        num = num * 10 + flag * (str[i]-'0');

                        //如果当前字符的下一个字符不为数字,或者已经到了字符串尾部
                        //将num加到总和sum上,并重置num和flag
                        if(i+1 < len && (str[i+1] > '9' || str[i+1] < '0')){
                            sum += num;
                            num = 0;
                            flag = 1;
                        }
                }
            }
        }
        sum += num;
        return sum;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值