字符串之数字子串求和

来源:互联网 发布:浙江大学宁波软件学院 编辑:程序博客网 时间:2024/05/31 18:59

题目:给定一个字符串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;         }}


结果:

sumOne36sumTwo7sumThree-13

总结:变量要定义好,然后多少个‘-’号用boolean类型的接受,因为只有2中可能,然后就是细节要分析到位。



0 0
原创粉丝点击