把字符串转换成整数

2020-02-17  本文已影响0人  囧略囧

题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
+2147483647
1a33
输出
2147483647
0

这道题目逻辑较简单,但是明显考察的是各种边界条件、特殊用例。包括:
1、长度溢出
2、整型的上溢出与下溢出
3、非法字符(非数字字符)
4、带正负号的字符串
5、仅有正负号的字符
6、输入为null
7、空字符串""

下面是自己AC掉的代码,由于牛客讨论区未见到考虑周全代码,故不做整理

public class Solution {
    public int StrToInt(String str) {
        long result = 0;
        //虽然使用long型保存result,最后进行截断得int,但即使是long甚至longlong都有可能溢出,
        //所以必须对位数长度进行控制。int型的长度最多为10位,考虑到正负号取11位。
        if(str.length() > 11 || str == null || str.length() == 0)
            return 0;
        //设置reallength来记录除了符号位以外的数字位数,当然也可以通过对符号为置'0'从而求和的时
        //候直接使用str.length便可以,但java中String是不可变的,反而会更麻烦
        int reallength = str.length();
        int flag = 1;
        int start = 0;
        //判断是否存在符号位
        if(str.charAt(0) == '+') {
            flag = 1;
            reallength--;
            start = 1;
        }
        else if(str.charAt(0) == '-') {
            flag = -1;
            reallength--;
            start = 1;
        }
        //判断非法字符
        for(int i = start; i < reallength + start; i++) {
            if(str.charAt(i) >= '0' && str.charAt(i) <= '9') {
                result = result * 10 + str.charAt(i) - '0';
            }
            else 
                return 0;
        }
        result *= flag;
        //判断整型的上溢出及下溢出,二者的绝对值不相等
        if(result > Integer.MAX_VALUE || result < Integer.MIN_VALUE)
            return 0;
        else
            return (int) result;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读