题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
+2147483647
1a33
输出
2147483647
0
解题思路
class Solution {
public int myAtoi(String str) {
int i = 0;
//1、空格
while (i < str.length() && str.charAt(i) == ' ') {
i++;
}
if (i >= str.length())
return 0;
//2、正负标志
int sign = 1;
if (str.charAt(i) == '+' || str.charAt(i) == '-') {
if (str.charAt(i) == '-') {
sign = -1;
}
i++;
}
//3、溢出+转换为整数
int res = 0;
while (i < str.length()) {
if (str.charAt(i) < '0' || str.charAt(i) > '9') {
break;
}
if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && str.charAt(i) - '0' > 7)) {
return sign == -1 ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
res = 10 * res + (str.charAt(i) - '0');
i++;
}
return res*sign;
}
}
public class Solution {
public int StrToInt(String str)
{
//空字符串
if(str.length()==0)
return 0;
char[]chars=str.toCharArray();
boolean isNegative=false;//标记正负
int res=0;
for (int i = 0; i <chars.length ; i++)
{
if(i==0&&(chars[i]=='+'||chars[i]=='-'))//首位正负号,代表数的正负
{
if(chars[i]=='-')
isNegative=true;
continue;//结束循环体中后面语句的执行,直接跳到for开头执行下一次循环i=1
}
/*
if((chars[0]=='+'||chars[0]=='-'))//不能写成这种,这样每次都执行这条语句,continue之后,陷入死循环
{
if(chars[0]=='-')
isNegative=true;
continue;//结束循环体中后面语句的执行,直接跳到for开头执行下一次循环i=1
}
*/
//0-9之外的数字/特殊字符,都是非法输入
if(chars[i]<'0'||chars[i]>'9')//不要把||写成&&,就错在这里了
return 0;
res=res*10+ (chars[i] - '0');//第一次循环,,res:0 chars:{-,1,2,3} i=1 chars[1] - '0'=对应ascii码值相减
//第2次循环,,res:1 chars:{-,1,2,3} i=2
}
return isNegative ? -res : res;
}
}