《剑指Offer》Java刷题 NO.49 把字符串转换成整数(字符串、实现库函数、边界条件、越界判断整合)

    技术2022-07-10  151

    《剑指Offer》Java刷题 NO.49 把字符串转换成整数(字符串、实现库函数、边界条件、越界判断整合)

    传送门:《剑指Offer刷题总目录》

    时间:2020-07-01 题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 输入描述:

    输入一个字符串,包括数字字母符号,可以为空 +2147483647 1a33

    输出描述:

    如果是合法的数值表达则返回该数字,否则返回0 2147483647 0

    思路: 这题主要是边界条件非常多, 相当于实现Integer.valueOf(string) 空字符串、正负号、有无非法字符、数据上下的溢出 关于越界: isNegtive(-1代表负数,1代表正数),digit 为当前值,我们设置一个变量 overValue 来表示当前的值和 INT_MAX/10 的差,因为 INT_MAX/10 为正数,所以当当前值为负数时,需要统一转化为正数,故而有:

    overValue = isNegtive*value - INT_MAX/10;

    这样,当 overValue > 0 时,越界,overValue < 0 时,不越界,而当 overValue == 0 时:正数时(isNegtive == 1),digit > 7 越界,负数时(isNegtive == -1),digit > 8 越界,通过 (isNegtive+1)/2 来将 -1、1转换为0、1,从而使有关 digit 的判断统一转化为: 当 (isNegtive+1)/2 + digit > 8 时,数值越界; 综上,令:

    overValue = isNegtive*value - INT_MAX/10 + (((isNegtive+1)/2 + digit > 8) ? 1:0);

    则当 overValue > 0 时,数值将会越界,反之,则不会 注意边界条件之后挨个转化成数字然后每次*10相加就行了


    Java代码:

    /** * @author LiMin * @Title: StrToInt * @Description: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 * @date 2020/7/19:48 */ public class StrToInt { public static void main(String[] args) { StrToInt strInt = new StrToInt(); System.out.println(strInt.strToInt("+2147483647")); System.out.println(Integer.valueOf("+2147483648")); } public int strToInt(String str) { if (str == null || str.length() == 0) return 0; int i = 0; int isNegtive = 1;//正负标志 int value = 0; int overValue = 0;//是否越界的标志,大于0说明越界,否则没有 if (str.charAt(i) == '+') { i++; } else if (str.charAt(i) == '-') { i++; isNegtive = -1; } while (i < str.length()) { if (!isNumber(str.charAt(i))) return 0;//出现不是数字的非法字符就返回0 int digit = str.charAt(i) - '0'; //MAX_VALUE=2^31-1=2147483647;MIN_VALUE=-2^31=-2147483648 overValue = isNegtive * value - Integer.MAX_VALUE/10 + ((isNegtive + 1) / 2 + digit) > 8 ? 1 : 0;//计算是否越界 if (overValue > 0) return 0; else value = value * 10 + isNegtive * digit ; i++; } return value ; } public boolean isNumber(char c) { if (c >= '0' && c <= '9') return true; else return false; } }
    Processed: 0.013, SQL: 9