计算字符串中数字的和

【题目】

给定一个字符串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;
	}
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值