实现 atoi
,将字符串转为整数。
该函数首先根据需要丢弃任意多的空格字符,直到找到第一个非空格字符为止。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
若函数不能执行有效的转换,返回 0。
说明:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
思路:五种情况1正号2负号3空格4数字5其他字符
正号时,如果第一次碰到赋予符号标志位,不是第一次就结束循环。负号同理
空格时,如果是第一次碰到继续循环不是第一次就结束循环
其他字符时,如果是第一次碰到就返回0不是第一次就结束循环
数字时,拼接到res,继续循环
/**
*
* @author Mr.Xu
* @TODO TODOAtoi 除了数字0-9之外都要判断是否是第一次碰到
* @date 2018年9月23日
*/
public static int myAtoi(String str) {
int sign = 1;
String res = "";
if (str.trim().length() == 0)
return 0;
boolean flag = true;//是否第一次碰到标志位
for (int i = 0; i < str.length(); i++) {
char t = str.charAt(i);
if ((int) (t) == 45) {// -
if (flag) {
sign = -1;
flag = false;
continue;
} else {
break;
}
} else if ((int) (t) == 43) {
if (flag) {
sign = 1;
flag = false;
continue;
} else {
break;
}
} else if ((int) (t) == 32) {
if (flag) {
continue;
} else {
break;
}
} else if ((int) (str.charAt(i)) <= 57&& (int) (str.charAt(i)) >= 48) {
res += t;
flag = false;
} else {
if (flag) {
return 0;
} else {
break;
}
}
}
if (res.length() == 0)
return 0;
try {
int resInt = Integer.parseInt(res);
return resInt * sign;
} catch (Exception e) {
if (sign == -1) {
return Integer.MIN_VALUE;
} else {
return Integer.MAX_VALUE;
}
}
}
#python3中 sys.maxsize获取最大整数限制,已经超过了java的integer限制
class Solution:
def myAtoi( str):
"""
:type str: str
:rtype: int
"""
if str == "":
return 0
sign = 1
res = ""
firstFlag = True
for i in str:
if ord(i) == 32:
if firstFlag==True:
continue
else:
break;
elif ord(i) == 43:
if firstFlag==True:
sign *= 1
firstFlag = False
continue
else:
break;
elif ord(i) == 45:
if firstFlag==True:
sign *= -1
firstFlag = False
continue
else:
break;
elif ord(i) <= 57 and ord(i) >= 48:
res += i
firstFlag = False
else:
if firstFlag == True:
return 0
else:
break
if res == "":
return 0
resInt = int(res) * sign
if -2147483648 < resInt < 2147483647:
return resInt
elif sign == -1:
return -2147483648
else:
return 2147483647