欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

字符串中数字子串求和

程序员文章站 2022-03-11 16:20:01
...

字符串中数字子串求和

数字子串求和

【题目】
给定一个字符串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(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

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

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