题目
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回
INT_MAX (231 − 1) 或 INT_MIN (−231) 。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-to-integer-atoi
C++
我的C++题解
class Solution {
public:
int myAtoi(string str) {
long long ans = 0;
int flag = 1;
int start = 0;
for(int i = 0; i < str.size(); i++){
if(start == 0){
if(str[i] == ' '){
continue;
}else if(str[i] == '-'){
flag = -1;
start = 1;
}else if(str[i] == '+'){
flag = 1;
start = 1;
}else if(str[i] >= '0' && str[i] <= '9'){
flag = 1;
start = 1;
ans = str[i] - '0';
}else{
return 0;
}
}else{
if(str[i] >= '0' && str[i] <= '9'){
ans = ans * 10 + (str[i] - '0');
if(ans >= 2147483648){
if(flag == 1){
return INT_MAX;
}else{
return INT_MIN;
}
}
}else{
break;
}
}
}
return ans*flag;
}
};
代码结果
个人总结
这个代码比较符合逻辑,之前有一个用例’+1’没通过
但是本解法忽略了不能使用long类型,则在此改进为:
// 题目中说:环境只能存储 32 位大小的有符号整数,因此,需要提前判断乘以 10 以后是否越界
if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (currChar - '0') > Integer.MAX_VALUE % 10)) {
return Integer.MAX_VALUE;
}
if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (currChar - '0') > -(Integer.MIN_VALUE % 10))) {
return Integer.MIN_VALUE;
}
Python
我的python题解
class Solution:
def myAtoi(self, str: str) -> int:
ans = 0
for sti in str.split(' '):
if sti != '':
j = len(sti)
d = 0
for i in range(0,len(sti)):
if i == 0 and (sti[i] == '-' or sti[i] == '+'): # '+'
j = 0
d = 1
continue
if i == 1 and d == 1 and (sti[i] == '-' or sti[i] == '+'): # '+-1'
return 0
elif i == 1: # !!
j = len(sti)
if not ((sti[i] >= '0' and sti[i] <= '9')):
j = i
break
if j == 0 or (d == 1 and (not (sti[1] >= '0' and sti[1] <= '9'))): # '+abc' '+1'
return 0
ans = int(sti[:j])
break
if ans >= 2147483648:
return 2147483647
if ans <= -2147483648:
return -2147483648 #...
return ans
运行结果
个人总结
整体代码逻辑并未按照之前的来,导致逻辑性不太好
这个题解觉得不错:
class Solution:
def myAtoi(self, s: str) -> int:
return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)