2018-8-30华为机试题第1题

问题描述:字符串之数字子串求和

2018-8-30华为机试题第1题_第1张图片

思路:要求时间复杂度O(N),空间O(1)
   1.不管遇到什么先-'0' =>cur
   2.若cur不是数字->即不在0~9之间...需要先判断posi是不是false...
     因为没第一次遇到'-'则会把posi设置为false,第二次先去看看之前posi,
     如果是'-',那么就约掉这个'-',把posi设置为true...
   3.如果是'0'~'9',则开始计算num,每次增加10的倍数...然后各位加起来,此时还要好主意cur前边到底是正是负…

 代码是实现:

package cn.csu.huawei;

public class HuaweiTest1 {
	public static void main(String[] args) {
		int a=solution("A1ee2E33");
		int b=solution("A-1B--2C--D6E");
		int c=solution("A1e3e2E03ds4-e-3-00-23");
		System.out.println(a+","+b+","+c);
	}
	
	public static int solution(String str) {
		if(str.length()==0 || str==null) {
			return 0;
		}
		int ret = 0;//最后结果
		int num=0;//表示当前收集到的数字
		boolean boo = true;//如果数字为正 则 boo为true,如果为负,则boo为false
		char[] array = str.toCharArray();
		for(int i=0;i即不在0~9之间
			if(cur<0 || cur>9) {//如果当前字符不是数字
				//之所以把num放到非num的判断里面是因为,到此为止这个num的
                //统计已经结束,例如123A-> num= (((1)*10)+2)*10 +3 = 123,
                //当计算到A的时候num正好统计出来...故可以计算res+=num...
				ret+=num;
				num=0;
				//如果字符中出现负号
				if(array[i]=='-') {
					//当出现'-' 的时候就需要去判断这个'-' 到底是第一个'-' 还是第二个
                    //原则是第一次出现'-' 就令boo为false...出现两次就设为true...
					if(i-1>-1 && array[i-1]=='-') {
						//判断的时候,防止是'-' 开头的,则需要用i-1>-1判断..
						boo = true;
					}else {
						boo =false;
					}
				}else {
					boo = true;
				}
			}else {
				num = num*10+(boo?cur:-cur);
			}
		}
		
	
		ret +=num;
		
		
		return ret;
	}
	
}

 

你可能感兴趣的:(算法与数据结构)