zoukankan      html  css  js  c++  java
  • 字符串中数字子串的求和

    题目:给定一个字符串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;
        }
  • 相关阅读:
    Java页面中文编码要转换两次encodeURI
    ajax用get刷新页面元素在IE下无效解决~~
    祝贺自己开博~~
    错误域控降级导致解析问题
    ELK 脚本自动化删除索引
    Windows针对子目录共享权限控制
    ES查询区分大小写
    Docker异常时区问题
    Docker自定义镜像无容器日志输出
    ELK时间戳
  • 原文地址:https://www.cnblogs.com/zhaoqi3215/p/5303925.html
Copyright © 2011-2022 走看看