题目:给定一个字符串str,求其中全部数字串所代表的数字之和。
要求:忽略小数点子,如”A1.3”包含两个数字1和3.
如果紧贴数字子串左边出现”-“,如果连续出现奇数个则视为负,如果连续出现偶数个则视为正。如”A-1BC–12”其中包含数字-1和-12。
例:A1CE2E33,返回36。
实现:如何从左至右遍历str时,准确地收集每个数字并加起来。时间复杂的O(N),额外空间复杂度O(1)。
1.设置3个变量。rst表示目前的累加和;num表示当前收集到的数;布尔型变量sign表示num加到rst中是正还是负数。
2.对于cha是’0’~’9’的数字字符,设当前字符cur=cha-‘0’,之前收集的数字位num。
例如str=”123”,当cha=’1’,num=1,当cha=’2’,num=12,当cha=’3’,num=123。
例如str=”-123”,初始时num=0,sign=true。当cha=’-‘,posi变为false。当cha=’1’,num=-1,当cha=’2’,num=-12,当cha=’3’,num=-123。
即num=num*10+(sign?cur:-cur)。
3.对于cha是非数字字符,说明前一个数字已经遍历完,直接rst+=num,然后收集数字的变量重置num=0。累加完后,
1)如果cha!=’-‘(即即不为数字,也不为’-‘),则sign=true;
2)如果cha=’-‘,则看cha的前一个字符是否为’-‘,如果是,则sign=!sign(注意这里没有直接true,因为’-‘符号个数可能大于2),否则sign=’false’。
4.由于上面是当遇到非数字字符时对rst进行累加,当字符串后面出现的是数字时,由于已经跳出了循环体,为了防止数字累加不上的情况,需要最后进行一次rst+=num。
1 | public class NumSum { |