題目:給定一個字符串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; }
