67 把字符串转换成整数
题目
写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。
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

浙公网安备 33010602011771号