赞
踩
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程
- package live.every.day.ProgrammingDesign.CodingInterviewGuide.String;
-
- /**
- * 字符串中数字子串的求和
- *
- * 【题目】
- * 给定一个字符串str,求其中全部数字串所代表的数字之和。
- *
- * 【要求】
- * 1.忽略小数点字符,例如"A1.3”,其中包含两个数字1和3。
- * 2.如果紧贴数字子串的左侧出现字符"-",当连续出现的数量为奇数时,则数字视为负,连续出现的数量为偶数时,则数字视为正。例
- * 如,"A-1BC--12",其中包含数字为-1和12。
- *
- * 【难度】
- * 简单
- *
- * 【解答】
- * 解决本题能做到时间复杂度为O(N)、额外空间复杂度为O(1)的方法有很多。本文仅提供一种供读者参考。解法的关键是如何在从左到
- * 右遍历str时,准确收集每个数字并累加起来。具体过程如下:
- *
- * 1.生成三个变量。整型变量res,表示目前的累加和;整型变量num,表示当前收集到的数字;布尔型变量isPositive,表示如果把
- * num累加到res里,num是正还是负。初始时,res=0,num=0,isPositive=true。
- * 2.从左到右遍历str,假设遍历到字符cha,根据具体的cha有不同的处理。
- * 3.如果cha是'0'~'9',cha-'0'的值记为cur,假设之前收集的数字为num,num=num*10+(isPositive?cur:-cur)。
- * 4.如果cha不是'0'~'9',此时不管cha具体是什么,都是累加时,令res+=num,然后令num=0,累加完num当然要清零。累加完成
- * 后,再看cha具体的情况。如果cha不是字符-,令isPositive=true,即如果cha既不是数字字符,也不是'-'字符,isPositive
- * 都变为true。如果cha是字符'-',此时看cha的前一个字符,如果前一个字符也是'-'字符,则isPositive改变符号,即
- * isPositive=!isPositive;否则令isPositive=false。
- * 5.既然我们把累加的时机放在了cha不是数字字符的时候,那么如果str是以数字字符结尾的,会出现最后一个数字没有累加的情况。
- * 所以遍历完成后,令rest+=num,防止最后的数字累加不上的情况发生。
- * 6.最后返回res。
- *
- * 具体实现请参看如下代码中的numSum方法。
- *
- * @author Created by LiveEveryDay
- */
-
- public class NumberSubStringSum {
-
- public static int numSum(String str) {
- if (str == null) {
- return 0;
- }
- char[] charArr = str.toCharArray();
- int res = 0;
- int num = 0;
- boolean isPositive = true;
- int cur = 0;
- for (int i = 0; i < charArr.length; i++) {
- cur = charArr[i] - '0';
- if (cur < 0 || cur > 9) {
- res += num;
- num = 0;
- if (charArr[i] == '-') {
- if ((i - 1) > -1 && charArr[i - 1] == '-') {
- isPositive = !isPositive;
- } else {
- isPositive = false;
- }
- } else {
- isPositive = true;
- }
- } else {
- num = num * 10 + (isPositive ? cur : -cur);
- }
- }
- res += num;
- return res;
- }
-
- public static void main(String[] args) {
- String str1 = "A1CD2E33";
- String str2 = "A-1B--2C--D6E";
- System.out.printf("sum1 = %s%n", numSum(str1));
- System.out.printf("sum2 = %s%n", numSum(str2));
- }
-
- }
-
- // ------ Output ------
- /*
- sum1 = 36
- sum2 = 7
- */
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。