您的位置:首页 > 其它

字符串之数字子串求和

2015-11-04 22:10 288 查看

题目:给定一个字符串str,求其中全部数字串所代表的数字之和

要求:

              1、忽略小数点字符,例如“A1.3”,其中包括2个数字1和3

              2、如果是紧贴数字子串的左侧出现字符“-”,当连续出现的数量为奇数时,则数字视为负,连续出现的数量为偶数的则          数字视为正,例如,“A-1BC--12”,其中包含数字为-1和12.

举例子:str="A1CD2E33",返回36

               str="A-1B--2C--D6E"返回7

思路:

            1  我们需要3个变量,一个是sum表示目前累加的和,为什么要sum这个变量,你不求和吗?求和肯定要用一个变量去接受之前累加的值,一个是整形变量num,表示当前收集定的数字,为什么要当前的数字,我插,题目中不是说了要加子串的数字吗?不定义怎么得到,布尔变量boo,如果num是正,boo=true,如果num为负,boo=false;

            2  从左到右遍历str,假设遍历的字符cha,更具具体的cha有不同的处理,为什么要遍历,我插,不便利怎么得到我们需要中间的数据  

           3  比如str="123",初始时 num=0,boo=true,当cha=='1'时,num变成1,cha=='2',num==2,例如str="-123",初始num=0,boo=true,

cha=='-',boo=false,cha='1' num=-1,cha=='2' num=-12,总之,num=num*10+(boo?cur:-cur);

           4 如果不是“0”-“9”,此时不管具体是什么,都是累加时,sum+=num,然后令num=0,累加完当然要清0,累加完成之后,在看cha是什么情况,如果不是‘-’,那么boo要变成true,如果cha不是数字字符也不是‘-’字符,boo变成true,如果cha='-',此时看cha的前一个字符,如果前一个字符也是‘-’字符,boo要改变符号,boo=!boo;否则令boo=false;

 

下面是java实现

public class SubStringNumSum {
public static void main(String[] args) {
int sum1=subStringSum("A1ee2E33");
int sum2=subStringSum("A-1B--2C--D6E");
int sum3=subStringSum("A1e3e2E03ds4-e-3-00-23");

System.out.println("sumOne\t"+sum1);
System.out.println("sumTwo\t"+sum2);
System.out.println("sumThree\t"+sum3);
}
public static int subStringSum(String string){
if(string==null){
return 0;
}
int sum=0;                  //求和变量
int num=0;                  //子串中需要累加的值
boolean boo=true;    //值之前的符号代表,true为正数,false为负数
char cur='0';                 //当前的字符
char[] arrays=string.toCharArray();
for(int i=0;i<arrays.length;i++){
cur=(char) (arrays[i]-'0');
if(cur<0 || cur>9){  //注意这个地方cur<'0'||cur>'9',因为你减去了’a‘,所以数字在0-9之间
sum+=num;
// boo=true;
num=0;             //注意这个地方num要变成0
if(arrays[i]=='-'){ //注意这个地方不是cur=='-‘,而应该是arrays[i]=='-'
if(i-1>-1&&arrays[i-1]=='-'){ //当第一个字符是'-',下面的boo=false,
boo=!boo; //当‘-’连续的时候,为boo=!boo
}else{ //例如‘-A-’最后一个是‘-’令boo=false,即为负数。
boo=false; //(因为‘-’前面3种可能,没有字符,为‘-’,不为‘-’
}
}else{
boo=true;//只要‘-’结束,我们就应该变boo变成true.
}
}else{
num=num*10+(boo?cur:-cur); //累加中间的数字,如果前面是true,说明是正数,反正为负数
}
}
sum+=num; //最后一个数字要加上,注意
return sum;
}
}


结果:

sumOne 36
sumTwo 7
sumThree -13

总结:变量要定义好,然后多少个‘-’号用boolean类型的接受,因为只有2中可能,然后就是细节要分析到位。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: