本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指Offer》Java实现合集  

题目

  请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。

思路

  题目很简单,主要就是实现对每个字符转化为数字,并进行累加即可。但是有很多特殊情况都需要考虑进去,例如null、空字符串、带有正负号、字符不是数字、溢出等等。

  对于非法的特殊输入,返回值为0,还要用一个全局变量进行标记。

  写代码时一定要考虑清楚各种测试用例。

 

 测试用例

  1.功能测试(正、负、零、带有正负号的数字)

  2.边界值测试(最大正整数,最小负整数)

  3.特殊测试(null,数空字符串,仅有正负号,非法字符)

Java代码

  今天脑子有点乱,代码总感觉不是很简洁,有点繁琐,但功能是完善的。

  附注:字符串如果仅有正负号这里认定为非法输入

//题目:请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不
//能使用atoi或者其他类似的库函数。

public class StringToInt {
    static boolean isValid = false;
    public static int strToInt(String str) {
        if(str == null || str.length()<=0)
            return 0;
        char[] chars = str.toCharArray();
        long num=0;  //先用long来存储,以防止越界
        boolean minus=false;
        for(int i=0; i<chars.length; i++){
            if(i==0 && chars[i]=='-'){
                minus=true;
            }else if(i==0 && chars[i]=='+'){
                minus=false;
            }else{
                int a=(int) (chars[i]-'0');
                if(a<0 || a>9){
                    isValid=false;
                    return 0;
                }
                num= (minus==false) ? num*10+a : num*10-a;
                isValid=true;  //不放在最后面是为了防止str=‘+’的情况被判断为true
                if((!minus && num>0x7FFFFFFF)
                   ||(minus && num<0x80000000)){
                    isValid=false;
                    return 0;
                }
            }
        }
        return (int)num;
    }
    
    //简单测试下
    public static void main(String[] args) {
		System.out.println(strToInt("1948243")==1948243);
		System.out.println(isValid==true);
		System.out.println(strToInt("+1948243")==1948243);
		System.out.println(isValid==true);
		System.out.println(strToInt("-1948243")==-1948243);
		System.out.println(isValid==true);
		System.out.println(strToInt("-0")==0);
		System.out.println(isValid==true);
		System.out.println(strToInt("-194+8243")==0);
		System.out.println(isValid==false);
		System.out.println(strToInt("")==0);
		System.out.println(isValid==false);
		System.out.println(strToInt(null)==0);
		System.out.println(isValid==false);
		System.out.println(strToInt("999999999999999")==0);
		System.out.println(isValid==false);
		System.out.println(strToInt("+")==0);
		System.out.println(isValid==false);
		
		System.out.println(strToInt("2147483647")==2147483647); //0x7FFFFFFF
		System.out.println(isValid==true);
		System.out.println(strToInt("2147483648")==0);
		System.out.println(isValid==false);
		
		System.out.println(strToInt("-2147483648")==-2147483648); //0x80000000
		System.out.println(isValid==true);
		System.out.println(strToInt("-2147483649")==0);
		System.out.println(isValid==false);
	}
}

  

true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
StringToInt

相关文章: