字符串问题---字符串中数字子串的求和

【题目】
  给定一个字符串str,求其中全部数字串所代表的数字之和。要求如下:

  1. 忽略小数点字符,例如“A1.3”,其中包含两个数字1和3.
  2. 如果紧贴数字子串的左侧出现字符“-”,当连续出现的数量为奇数时,则数字视为负,连续出现的数量为偶数时,则数字视为正。例如,“A-1BC- -12”,其中包含数字-1和12。

【举例】
  str = “A1CD2E33”返回36.
  str = “A-1B- -2C- -D6E”,返回7。

【基本思路】

  1. 使用三个变量。res,num和posi。res表示目前的累加和,num表示当前收集到的数字,posi表示数字num是正数还是负数,True表示正数,初始时res = 0, num = 0, posi = True。

  2. 从左到右依次遍历字符串,假设遍历到的字符为char。情况分析如下:

    1)如果char是 ‘0’ ~ ‘9’,假设之前收集的数字为num,则可以根据posi更新num的值,如果posi == True,则num = num×10 + (char - ‘0’),否则num = num×10 - (char - ‘0’)。posi的更新方法之后解释。

    2)如果char不是 ‘0’ ~ ‘9’,则说明num已经是一个完整的数字了,该累加到res了,所以res += num,然后令num = 0。累加完后观察此时char的值,如果此时的字符不是“-”,则令posi = True,如果此时的字符为“-”,判断前一个字符是否也是“-”,如果是的话,令 posi = !posi,否则令posi = False。

  3. 既然我们把累加的时机放在了char不是数字字符的时候,那么如果str是以数字字符结尾的,那么就会出现最后一个字符没有累加的情况。所以遍历完成后,还要再加一次num。

下面是使用python3.5实现的代码

#字符串中数字子串的求和
def numSum(str1):
    if str1 == None or len(str1) == 0:
        return 0
    res = 0
    num = 0
    cur = 0
    posi = True
    for i in range(len(str1)):
        cur = ord(str1[i]) - ord('0')
        if cur < 0 or cur > 9:
            res += num
            num = 0
            if str1[i] == '-':
                if i - 1 >= 0 and str1[i-1] == '-':
                    posi = not posi
                else:
                    posi = False
            else:
                pose = True
        else:
            num = num * 10 + cur if posi else -cur
    res += num
    return res
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值