leetcode08:[08字符串转换整数 (atoi)]
题目描述
实现一个 atoi
函数,使其能将字符串转换成整数
Example
输入: " -42"
输出: -42
solution idea
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
有bug的结果
class Solution {
public:
int myAtoi(string str) {
// string inter_str="0123456789";
long sum=0;
int first;
bool isnegative=false;
for (first=0;first<str.size();first++)
if (str[first]!=' ') break;
if ( (str[first]=='-') )
{
isnegative=true;
first+=1;
}
else if( (str[first]=='+') )
{
isnegative=false;
first+=1;
}
for (int j=first;j<str.size();j++)
{
int cur=str[j]-'0';
if (isdigit(cur)) sum=sum*10+cur;
else break;
}
sum= isnegative ? -sum : sum;
if (sum > 2^31-1) return 2^31-1;
if (sum < -2^31) return -2^31-1;
return sum;
}
};
别人的思路
class Solution {
public:
int myAtoi(string str) {
int res = 0;
int i = 0;
int flag = 1;
// 1. 检查空格
while (str[i] == ' ') { i++; }
// 2. 检查符号
if (str[i] == '-') { flag = -1; }
if (str[i] == '+' || str[i] == '-') { i++; }
// 3. 计算数字
while (i < str.size() && isdigit(str[i])) {
int r = str[i] - '0';
// ------ 4. 处理溢出,这是关键步骤 ------
if (res > INT_MAX / 10 || (res == INT_MAX / 10 && r > 7)) {
return flag > 0 ? INT_MAX : INT_MIN;
}
// ------------------------------------
res = res * 10 + r;
i++;
}
return flag > 0 ? res : -res;
}
};
python 实现
class Solution:
def myAtoi(self, str: str) -> int:
if str=="": return 0
start=0
for start in range(len(str)):
if str[start] != ' ':
break
isnegative=False
if str[start]=='+':
isnegative=False
start+=1
elif str[start]=='-':
isnegative=True
start+=1
start=start
result=0
while (start< len(str) and str[start] in '0123456789'):
result=result*10+int(str[start])
start=start+1
if isnegative:
result=-result
if result>2**31-1: return 2**31-1
if result<-2**31: return -2**31
return result
参考文献
- c++ prime 第5版
- c++ 标准库
- devdocs