剑指offer——面试题:把字符串转换为整数

来源:互联网 发布:mysql应用 编辑:程序博客网 时间:2024/04/29 14:52

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


+2147483647
1a33


输出

2147483647
0

      我的代码:

class Solution {public:    int StrToInt(string str) {        bool g_statue = true; // 判断数值为 0, 还是字符串不是一个合法的字符 的全局状态量        bool flag_valid = true;   // 判断字符串是否合法                int flag = 1;  // 判断第一位是正是负        long long num = 0;                if(str.empty())        {             flag_valid = false;  // 如果为空,不合法        }                 if(str[0] == '0' && str.size() == 1)  // 只有一个字符“0”,返回0        {            return 0;  // 合法.状态变量 g_statue 不变        }                if(str[0] == '-')             flag = -1;        if(str[0] == '+')            flag = 1;                if(str[0] == '-' || str[0] == '+')        {            if(str.size() == 1)            {                flag_valid = false;  // 如果只有一个正负号,则不合法            }            else            {                for(int i = 1;i < str.size();++i)            {                if(str[i] > '0' && str[i] < '9')                {                    num = num * 10 + flag * (str[i] - '0');// 合法的情况                    if(num > 0x7FFFFFFF || num <(signed int) 0x80000000)                    {                    flag_valid = false;  // 数据溢出,则不合法                    break;                    }                }                else                {                    flag_valid = false;  // 如果任何一个字符串不在 ‘0’ ~ ‘9’ 之间,则不合法                    break;                }            }            }                    }                else  // 不是以 +- 号开头,        {            for(int i = 0;i < str.size();++i)            {                if(str[i] > '0' && str[i] < '9')                {                    num = num * 10 + flag * (str[i] - '0');  // 合法的情况                    if(num > 0x7FFFFFFF || num <(signed int) 0x80000000)                    {                    flag_valid = false;  // 数据溢出,则不合法                    break;                    }                }                else                {                    flag_valid = false;  // 如果任何一个字符串不在 ‘0’ ~ ‘9’ 之间,则不合法                    break;                }            }        }                if(flag_valid == false)   // 如果不合法        {            g_statue = false;            return 0;        }        else            return num;    }};

      分析:这一题的难点主要在于确定什么情况下为无效输入。无效输入应该有以下几种情况:

(1)、空字符串或者只有一个 + 或者 -;

(2)、每一个数值字符不在 '0' ~ '9' 之间。如果第一个字符是 + 或者 - ,则需要从str[1] 开始往后遍历。如果第一个符号不是 + ,那么需要从 str[0] 开始遍历

(3)、字符串合法,但是最后生成的整数溢出了

      因为题目要求,当无效的输入时,返回 0 , 但是 如果是字符串“0”,也是返回 0 。所以要使用一个全局状态变量 g_statue 来进行区分


      《剑指offer》 一书上给的参考答案,函数的形参是 char * ,反而处理起来简单一些

阅读全文
1 0
原创粉丝点击