字符串問題:字符串中數字子串的求和

題目spa

  給定一個字符串 str, 求其中所有數字串所表明的數字之和。code

要求blog

  1. 忽略小數點,例如 「A1.3」,其中包含兩個數字 1 和 3.
  2. 若是緊貼數字子串的左側出現字符"-", 當連續出現的數量爲奇數時,則數字視爲負,連續出現的數量爲偶數時,則數字視爲正。好比,「A-1BC--12」, 其中包含數字 -1 和 12.
  3. 若字符串的長度爲N,時間複雜度爲 O(N), 額外空間複雜度爲 O(1)

舉例字符串

  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

  • 若是 cha 爲 ‘0’~‘9’,i 位置的值記爲 cur, cur = cha - '0'. 例如字符串 str = "123", 當 cha = '1', cur = 1,  num = 1; 當 cha = '2', cur = 2, num = 12 = 1*10+2; 當 cha = '3', cur = 3, num = 123 = 12*10+3, res = res + 123. 若字符串 str = "-123", 當 cha = '3', cur = 3, num = 123, res = res + (-123)

  具體實現請參考下面代碼中的 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 }
相關文章
相關標籤/搜索