【题目】spa
给定一个字符串 str, 求其中所有数字串所表明的数字之和。code
【要求】blog
【举例】字符串
str="A1CD2E33", 返回 36。class
str="A-1B--2C--D6E", 返回7。变量
【解答】遍历
解法的关键在于如何在从左到右遍历 str 时,准确收集每一个数字并累加起来。方法
1. 生成三个变量,整型变量 res, 表示当前的累加和; 整型变量 num, 表示当前收集到的数字; 布尔型变量 posi, 表示若是把 num 累加到 res 中,num 是正仍是负。初始时,res = 0, num = 0, posi = true。static
2. 从左到右遍历 str, 假设遍历到 i 位置的字符 cha, 根据具体的 cha 有不一样的处理:di
具体实现请参考下面代码中的 numSum 方法:
1 public class Main { 2 3 public static void main(String[] args) { 4 System.out.println(new Main().numSum("A1CD2E33"));//36 5 System.out.println(new Main().numSum("A-1B--2C--D6E"));//7 6 System.out.println(new Main().numSum("-A-1B--2C---D----6E--"));//7 7 } 8 9 public int numSum(String str){ 10 if(str == null || str.length() == 0) return 0; 11 char[] chs = str.toCharArray(); 12 int res = 0; //表示累积和 13 int num = 0; //表示当前位置收集到的数字 14 boolean posi = true; //表示收集到的数字是否为正, true 为正, false 为负 15 16 for(int i = 0, len = str.length(); i < len; i++){ 17 char ch = chs[i]; 18 if(ch >= '0' && ch <= '9'){//若当前字符为数字字符, 则继续收集 19 int cur = ch - '0'; 20 num = num * 10 + cur; 21 if(i == len-1){//若最后一个字符为数字字符, 则将 num 其累加到 res 22 res += posi? num : -num; 23 } 24 }else{//若遇到非数字字符, 则将 num 累加到 res 25 res += posi? num : -num; 26 num = 0; //将收集到的数值 num 累加后, 须要清空 27 if(ch == '-'){//若遇到负号'-', 则须要更改当前收集数字 num 的正负 28 if(i > 0 && chs[i-1] == '-'){ 29 posi = !posi; 30 }else{ 31 posi = false; 32 } 33 }else{//若遇到其余字符, 更改 num 为正 34 posi = true; 35 } 36 } 37 } 38 39 return res; 40 } 41 42 }