计算字符串中所有数字之和Python版

题目:
给定一个字符串,计算其中所有数字的和。其中,不考虑小数点,如果有奇数个“-”号,则数字为负,偶数个则数字为正。
例如,“a12b3mnh4”, 返回值19,
“-2fds—-43fnd”,返回值41。

代码:

class String(object):
    def __init__(self):
        pass

    def sum_of_num(self, str):
        sum, num, pos = 0, 0, 1
        if str == "":
            return 0
        for i in xrange(0, len(str)):
            if 48 <= ord(str[i]) <= 57:
                num = num * 10 + int(str[i])*pos
            else:  # 非数字
                sum += num
                num = 0
                if str[i] == '-':
                    if i-1 > -1 and str[i-1] == '-':  # 前面还有 - 号
                        pos = -pos
                    else:
                        pos = -1
                else:
                    pos = 1
        sum += num
        return sum

解析:
1、从头至尾进行一遍遍历,遇到数字的时候,判断之前的字符是否为数字,如果是数字,则两个数字组成一个两位数;三位以上的数同理。
2、当遇到的不是数字时,则之前的数字一定确定了下来,需要加到所有数字之和当中。
3、当遇到‘-’号时,需要判断之前的符号是否为‘-’,如果是,那么就要变号,如果不是,就确定为负号;如果当前的符号既不是数字,也不是‘-’,那么要规定符号为正。
根据以上的逻辑,重点就是判断在字符串中,前后两个字符之间的关系,主要有,数字和数字的关系,数字和非数字的关系,多个‘-’的关系。
所以,要确定几个变量,sum所有数字的总和,num当前确定下来的数字,pos数字的正负问题。所以,一遍遍历,时间复杂度为o(n),空间复杂度为o(1)。

体会:
感觉这个题还有点小难度,主要是几种字符的关系如何罗列到代码中,而且相互之间的嵌套是个需要思考的东西,说实话这个代码我参考别人的改了半天才搞对。
1、当遍历完成后,如果最后一个是数字,那么就没有加入到sum中,所以遍历完后需要补充一步。
2、python中的 布尔类型无法直接做‘非’操作,所以只能以正负1代替。

你可能感兴趣的:(Python,数据结构)