67 把字符串转换成整数

题目

写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。

剑指Offer OJ
AcWing OJ

C 语言题解

  • 考虑输入的字符串是否是NULL、空字符串
  • 考虑输入的字符串是否包含正负号或者是否是只包含正负号
  • 考虑输入的字符串是否会发生上溢或下溢(正整数的最大值是0x7FFFFFFF,最小的负整数是0x80000000)
  • 考虑如何区分正常返回数字0和返回输入是否合法的标识
// 定义枚举类型标识输入的合法性
enum Status { kValid = 0, kInvalid };
int g_nStatus = kValid;

int StrToInt(const char* str)
{
	g_nStatus = kInvalid;
	long long num = 0;
	int minus = 1;

	if (str != NULL && *str != '\0')
	{
                // 检查是否带有符号
		if (*str == '-')
		{
			minus = -1;
			str++;
		}
		else if (*str == '+')
			str++;

                // 遍历字符串
		while (*str != '\0')
		{
                        // 是数字则进行转换
			if (*str >= '0' && *str <= '9')
			{
				g_nStatus = kValid;
				num = num * 10 + ((*str) - '0');

				str++;
            
                                // 发生溢出
				if (((minus < 0) && (num  < (signed int)0x80000000)) || ((minus > 0) && (num > 0x7FFFFFFF)))
				{
					g_nStatus = kInvalid;
					num = 0;
					break;
				}
			}
			else
			{
				g_nStatus = kInvalid;
				num = 0;
				break;
			}

		}

		if (g_nStatus == kValid)
			num = num * minus;
	}

	return (int)num;
}

注意:

  • 整数中最小可以表示的数为(signed int)0x80000000,最大可以表示为:0x7FFFFFFF
  • g_nStatus 可以表示输入的合法性,这样就可以区别正常返回0和输入异常返回0的情况。

C++ 题解

思想与C语言题解的思路一致,并且是将string转换成字符指针类型求解。

class Solution {
public:
    // 定义一个枚举类型用于标识输入的合法性
    enum Status{kValid = 0,kInvalid};
    int g_nStatus = kValid;
     
    int StrToInt(string str) 
    {
      g_nStatus = kInvalid;
        long long num = 0;
        // string 类型转换成字符指针
        const char* cstr = str.c_str();
        
        if( (cstr != NULL) && (*cstr != '\0') )
        {
            // 判断有无符号位
            int minus = 1;
            if(*cstr == '-')
            {
                minus = -1;
                cstr++;
            }
            else if(*cstr == '+')
                cstr++;
            
            // 遍历字符串
            while(*cstr != '\0')
            {
                // 输入0-9之间是有效的
                if(*cstr > '0' && *cstr < '9')
                {
                    g_nStatus = kValid;
                    // 转换成数字
                    num = num*10 + (*cstr -'0');
                    cstr++;
                    
                    // 检查数据是否上溢或者下溢
                    if( ((minus>0) && (num > 0x7FFFFFFF)) ||
                        ((minus<0) && (num < (signed int)0x80000000)) )
                    {
                        //  发生溢出,输入无效,返回0
                        g_nStatus = kInvalid;
                        num = 0;
                        break;
                    }
                }
                else
                {
                    // 输入无效字符,返回0
                    g_nStatus = kInvalid;
                    num = 0;
                    break;
                }
            }
             
            // 输入有效,最终的数字带上符号
            if(g_nStatus == kValid)
                num = num * minus;
             
        }
        
        // 强制转换成int
        return (int)num;
    }
};

python 题解

# -*- coding:utf-8 -*-
class Solution:
    def StrToInt(self, s):
        # write code here
        numstrs=['0','1','2','3','4','5','6','7','8','9']
        sum = 0
        label = 1
        for i in range(len(s)):
            # 判断第一个字符的符号
            if i == 0:
                if s[i]=='-':
                    label=-1
                    continue
                elif s[i]=='+':
                    continue
            if s[i] in numstrs:
                #  利用字符在列表中的索引正好就是字符表示的数值
                sum =sum*10+numstrs.index(s[i])            
            else:
                sum = 0
                break
        return sum*label
posted @ 2019-01-31 16:47  youngliu91  阅读(134)  评论(0)    收藏  举报