字符串中数字子串求和

字符串中数字子串求和

数字子串求和

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

【要求】

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

【举例】
s=“A1.3”,返回4。
s=“A-1BC–12”,返回11。
s=“A1CD2E33”,返回36。
s=“A-1B–2C–D6E”,返回7。

算法思路

考虑逻辑分析能力和边界处理问题。

  1. 数字子串全为整数;
  2. 偶数个’-‘为正,奇数个’-'为负;
  3. 其他字符无特殊含义

res记录求和结果,num记录当前整数,flag记录其符号
遍历字符串s,数字字符出现时记录当前数至num,非数字字符出现时累加当前数至res,根据’-'的个数记录num的符号
最后一个字符可能是数字,此时刚记录完num,需再次将num结果累计至res,防止遗漏。

时间复杂度为 O ( N ) O(N) O(N),空间复杂度为 O ( 1 ) O(1) O(1)

相应代码

# 数字子串求和
def sum_sub_num_str(s):
    res = 0  # 求和结果
    num = 0  # 当前值
    flag = True  # 当前值符号
    for i in range(len(s)):
        c = s[i]
        if c >= '0' and c <= '9':
            num = num * 10 + ord(c) - ord('0')
        else:
            if flag is False:
                num = -num
            res += num
            num = 0
            if c == '-':
                if i - 1 >= 0 and s[i - 1] == '-':
                    flag = True
                else:
                    flag = False
            else:
                flag = True
    if flag is False:
        num = -num
    res += num
    return res

# 简单测试
if __name__ == '__main__':
    print(sum_sub_num_str("A1.3"))  # 4
    print(sum_sub_num_str("A-1BC--12"))  # 11
    print(sum_sub_num_str("A1CD2E33"))  # 36
    print(sum_sub_num_str("A-1B--2C--D6E"))  # 7

有任何疑问和建议,欢迎在评论区留言和指正!

感谢您所花费的时间与精力!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值