📜  门|门 IT 2007 |第 41 题(1)

📅  最后修改于: 2023-12-03 14:58:36.114000             🧑  作者: Mango

门|门 IT 2007 |第 41 题

题目描述

本题需要实现一个函数,用于计算一个字符串中的数字之和。

具体要求:

  1. 字符串中可能包含正负号,数字以及其他字符,函数需要过滤掉除了数字和正负号以外的其他字符。
  2. 字符串中可能同时包含多个数字,函数需要将这些数字全部相加后返回总和。
  3. 如果字符串为空或不包含数字,函数应该返回0。
  4. 如果字符串中出现的数字超过了int类型的最大取值范围,函数应该返回-1。

请你实现上述要求的函数,并在以下markdown代码块中给出完整的函数签名,函数实现代码以及测试样例。

函数签名
def sum_of_numbers(s: str) -> int:
    pass
实现代码
def sum_of_numbers(s: str) -> int:
    total_sum = 0
    current_digit = 0
    is_negative = False
    for c in s:
        if c.isdigit():
            current_digit = current_digit * 10 + int(c)
            if current_digit > (2**31 - 1):
                return -1
        elif c == '-':
            if current_digit != 0:
                total_sum += (current_digit if not is_negative else -current_digit)
                current_digit = 0
            if is_negative or total_sum != 0:
                return -1
            is_negative = True
        elif c == '+':
            if current_digit != 0:
                total_sum += (current_digit if not is_negative else -current_digit)
                current_digit = 0
            if total_sum != 0:
                return -1
        else:
            if current_digit != 0:
                total_sum += (current_digit if not is_negative else -current_digit)
                current_digit = 0
            if c != ' ' and (is_negative or total_sum != 0):
                return -1
    if current_digit != 0:
        total_sum += (current_digit if not is_negative else -current_digit)
    return total_sum
测试样例
assert sum_of_numbers("") == 0
assert sum_of_numbers("+") == 0
assert sum_of_numbers("-") == 0
assert sum_of_numbers("    ") == 0
assert sum_of_numbers("a") == 0
assert sum_of_numbers("123") == 123
assert sum_of_numbers("+123") == 123
assert sum_of_numbers("-123") == -123
assert sum_of_numbers("  +123   ") == 123
assert sum_of_numbers("  -123   ") == -123
assert sum_of_numbers("121  - 23") == -1
assert sum_of_numbers("12a34") == -1
assert sum_of_numbers("2147483648") == -1