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

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:58   1887   0

题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为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 * ,反而处理起来简单一些

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP