您的位置:首页 > 其它

字符串中数字子串的求和

2016-03-21 21:38 369 查看
题目:给定一个字符串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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: