【题目】
给定一个字符串str,求其中全部数字串所代表的数字之和。
【要求】
1、忽略小数点字符,例如"A1.3",其中包含两个数字1和3。
2、如果紧贴数字子串的左侧出现字符’-’,当连续出现的数量为奇数时,则数字为负数,连续出现的数量为偶数时,则数字为正数。例如,“A-1BC–12”,其中包含数字是-1和12。
【举例】
str = "-12a--3" 返回 -9
str = "-12a---3" 返回 -15
【代码】
import java.util.Scanner;
/**
* 给定一个字符串str,求其中全部数字串所代表的数字之和。
* 思路
* 1. 首先要判断传入的字符串引用变量是否是 null 或长度为0,若是,则直接返回 0 ,结束方法
* 2. 先将字符串存到字符数组,定义三个变量,sum = 0 是累加值,num = 0 是当前的数字,flag = true 是当前数字是正负标识符
* 3. 从左至右依次遍历字符串,根据当前字符做出不同的处理
* 4. 如果当前字符 cs[i] 是数字字符
* 4.1 先用 cur = cs[i] - '0' 保存当前的数字字符,再用 num = num * 10 + cur 将当前数字值 cur 累加到 num 中
* 4.2 同时还要判断当前字符 cs[i] 是否是最后一个数字字符,如果是就 sum += flag ? num : -num 将 num 累加到 sum中
* 5. 如果当前字符 cs[i] 不是数字字符
* 5.1 如果当前字符是 '-' ,先 sum += flag ? num : -num,然后必须 num = 0(谨记!!!),以便 num 记录下一个数字。然后判断当前字符的前一个字符是否也是 '-'。
* 5.1.1 如果是,则将 flag 取反!!!不能置为 true!!!举例:"1---3"
* 5.1.2 如果不是,则将 flag 置为 false ,表示当前数字 num 为负数
* 5.2 如果当前字符不是 '-' ,则将 flag 置为 true ,说明当前的数字 num 是正数
* 6. 当遍历完后,sum 中就是要求的和,返回 sum
*/
public class SumString {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.next();
int res = sumString(str);
System.out.println(res);
}
public static int sumString(String str) {
// 1. 首先判断传入的字符串引用变量是否为null或长度为0
if(str == null || str.length() == 0) {
return 0;
}
// 2. 传入的字符串非空,继续下面的操作
//定义辅助变量
char[] cs = str.toCharArray();//将字符串存到字符数组
int sum = 0;//累加值,默认为0
int num = 0;//当前的数字,默认为0
boolean flag = true;//当前数字num的正负状态,true为正,flase为负
//开始遍历字符数组
// 1. 当遍历到的字符是'0'~'9'之间。就将其转化成整型,然后累加到num
for(int i = 0; i < cs.length; i++) {
int cur = cs[i] - '0';//当前字符
if(cs[i] >= '0' && cs[i] <= '9') {//如果当前字符是数字字符,则继续收集
num = num * 10 + cur;
if(i == cs.length - 1) {//当最后一个字符是数字字符时
sum += flag ? num : -num;
}
}else {//如果当前字符是非数字字符
//先把之前的num累加到sum
sum += flag ? num : -num;
num = 0;//累加完 num 后,一定要将 num 重置为 0
if(cs[i] == '-') {//如果当前字符是'-'
//先判断当前字符'-'的前一个字符是否也是'-'
if(i > 0 && cs[i - 1] == '-') {//当前字符'-'的前一个字符也是'-',就将flag取反
flag = !flag;//取反!!!要考虑"-12a---3"这种情况
}else {//当前字符'-'的前一个字符不是'-',说明得到的当前数字 num 是个负数,将 falg 置为 false
flag = false;
}
}else {//如果遇到其他非'-'字符,则将 flag 置为 true
flag = true;
}
}
}
return sum;
}
}