剑指Offer JZ49 把字符串转换成整数 C++实现

    科技2024-06-20  82

    题目描述

    将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0

    输入描述:

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

    输出描述:

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


    示例输入

    +2147483647 1a33

    示例输出 

    2147483647 0

    解题思路


    方法一:遍历

    1、思路:遍历字符串:

    若字符串为空,返回0;去除字符串开头空格,若字符串为全空格字符串,返回0;判断遇到的第一个非空格字符,若为符号位,记录对应的符号;若还未遍历完字符串且当前字符为数字,则执行以下操作,否则跳转至7;判断当前整数是否溢出,若溢出的话根据符号位返回INT_MAX或INT_MIN,否则执行整数拼接;遍历下一个字符,跳转至操作4;若遍历长度小于字符串长度,返回0,否则根据符号位返回整数拼接结果。

    在这里判断整数溢出的方法是:

    若当前整数 > INT_MAX/10,则进行整数拼接时必定溢出;若当前整数 = INT_MAX/10且待拼接位 > 7时,则进行整数拼接时也会溢出;

    以上两种情况同时适用于正负数。Int类型取值范围为[,],即[-2147483648,2147483647]。

    2、代码:

    class Solution { public: int StrToInt(string str) { //判断空字符串 int len = str.length(), i = 0; if (len == 0) return 0; //去除开头空格 while (i < len && str[i] == ' ') i++; if (i == len) return 0; int sign = 1; //判断是否存在符号位 if (str[i] == '+' || str[i] == '-') { sign = (str[i] == '+') ? 1 : 0; i++; } int result = 0, boundry = INT_MAX / 10; while (i < len && str[i] >= '0' && str[i] <= '9') { if (result > boundry || (result == boundry && str[i] > '7')) { return result = sign ? INT_MAX : INT_MIN; } else { result = result * 10 + str[i] - '0'; } i++; } if (i != len) return 0; return sign ? result : -result; } };

    3、复杂度:

    时间复杂度:O(n);

    空间复杂度:O(1)。

    Processed: 0.011, SQL: 8