链接
牛客:把字符串转换成整数
LeetCode:剑指 Offer 67. 把字符串转换成整数
思路
就是将字符串先转化成字符数组,再转化成数字(利用ASCII码),如果第一个字符是 ‘-’ 要额外处理。
代码
牛客:
public class Solution {
public int StrToInt(String str) {
if (str == null || str.length() == 0)
return 0;
char[] a = str.toCharArray();
int sign = 0;
if (a[0] == '-') {
sign = 1;
}
int sum = 0;
for (int i = sign; i < a.length; i++) {
if (a[i] == '+')
continue;
if (a[i] < '0' || a[i] > '9')
return 0;
sum = sum * 10 + a[i] - '0';
}
return sign == 0 ? sum : sum * -1;
}
}
LeetCode:
class Solution {
public int myAtoi(String str) {
int len = str.length();
// str.charAt(i) 方法回去检查下标的合法性,一般先转换成字符数组
char[] charArray = str.toCharArray();
// 1、去除前导空格
int index = 0;
while (index < len && charArray[index] == ' ') {
index++;
}
// 2、如果已经遍历完成(针对极端用例 " ")
if (index == len) {
return 0;
}
// 3、如果出现符号字符,仅第 1 个有效,并记录正负
int sign = 1;
char firstChar = charArray[index];
if (firstChar == '+') {
index++;
} else if (firstChar == '-') {
index++;
sign = -1;
}
// 4、将后续出现的数字字符进行转换
// 不能使用 long 类型,这是题目说的
int res = 0;
while (index < len) {
char currChar = charArray[index];
// 4.1 先判断不合法的情况
if (currChar > '9' || currChar < '0') {
break;
}
// 题目中说:环境只能存储 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;
}
// 4.2 合法的情况下,才考虑转换,每一步都把符号位乘进去
res = res * 10 + sign * (currChar - '0');
index++;
}
return res;
}
}