字符串中数字子串的求和

时间:2022-05-11 22:14:44

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

要求:

1.忽略小数点字符,例如:”A1.3”,将其看成1和3两个数字

2.如果津贴数字子串的左侧出字符“-”,当连续出现数量为奇数的时候,则试后面数字为负,连续数值为偶数时,则视为正…

eg:“A-1BC--12”结果为->11

思路:要求时间复杂度O(N),空间O(1)
1.不管遇到什么先-'0' =>cur
2.若cur不是数字->即不在0~9之间...需要先判断posi是不是false...
因为没第一次遇到'-'则会把posi设置为false,第二次先去看看之前posi,
如果是'-',那么就约掉这个'-',把posi设置为true...
3.如果是'0'~'9',则开始计算num,每次增加10的倍数...然后各位加起来,此时还要好主意cur前边到底是正是负…
public int numSum(String str) {
        if (str == null) return 0;
        char[] chars = str.toCharArray();
        int res = 0;
        int num = 0;
        boolean posi = true;
        for (int i = 0; i < chars.length; i++) {
            int cur = chars[i] - '0';
            if (cur < 0 || cur > 9) {
                //之所以把num放到非num的判断里面是因为,到此为止这个num的
                //统计已经技术,例如123A-> num= (((1)*10)+2)*10 +3 = 123,
                //当计算到A的时候num正好统计出来...故可以计算res+=num...
                res += num;
                num = 0;
                if (chars[i] == '-') {
                    //当出现'-' 的时候就需要去判断这个'-' 到底是第一个'-' 还是第二个
                    //原则是第一次出现'-' 就令posi为false...出现两次就设为true...
                    if (i - 1 > -1 && chars[i - 1] == '-') {
                        //判断的时候,防止是'-' 开头的,则需要用i-1>-1判断...
                        posi = true;
                    } else {
                        posi = false;
                    }
                } else {
                    posi = true;
                }
            } else {
                num = num * 10 + (posi ? cur : -cur);
            }
        }
        res += num;
        return res;
    }