【題目】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 }