剑指–把字符串转换成整数
1,题目:
2,思路:
代码一:
根据题意,有以下四种字符需要考虑:
-
(1)首部空格: 删除之即可;
-
(2)符号位: 三种情况,即 “+” , “-”, ''无符号" ;新建一个变量保存符号位,返回前判断正负即可。
-
(3)非数字字符: 遇到首个非数字的字符时,应立即返回。
-
(4)数字字符:
字符转数字: “此数字的 ASCII 码” 与 “ 0 的 ASCII 码” 相减即可;
数字拼接: 若从左向右遍历数字,设当前位字符为 c ,当前位数字为 x ,数字结果为 res ,则数字拼接公式为:
res = 10 *res + x
x = ascii © - ascii(‘0’) -
(5)关于越界处理:
题目要求返回的数值范围应在 [-2^{31}, 2^{31} - 1],因此需要考虑数字越界问题。而由于题目指出 环境只能存储 32 位大小的有符号整数 ,因此判断数字越界时,要始终保持 res 在 int 类型的取值范围内。
代码二:
第一步,跳过前面若干个空格,如果字符串全是空格直接返回
第二步,判断正负号,如果是正负号,还需要将指针i,跳过一位
第三步,循环判断字符是否在 0~9之间
-
'0’的ASCII码是48,'1’的是49,这么一减就从就可以得到真正的整数值
-
判断是否大于 最大32位整数
-
判断是否小于 最小32位整数
第四步,如果有负号标记则返回负数。
3,代码:
代码一:
class Solution {
public int strToInt(String str) {
/*
根据题意,有以下四种字符需要考虑:
(1)首部空格: 删除之即可;
(2)符号位: 三种情况,即 ''++'' , ''-−'' , ''无符号" ;新建一个变量保存符号位,返回前判断正负即可。
(3)非数字字符: 遇到首个非数字的字符时,应立即返回。
(4)数字字符:
字符转数字: “此数字的 ASCII 码” 与 “ 00 的 ASCII 码” 相减即可;
数字拼接: 若从左向右遍历数字,设当前位字符为 cc ,当前位数字为 xx ,数字结果为 resres ,则数字拼接公式为:
res = 10 *res + x
x = ascii(c) - ascii('0')
(5)关于越界处理:
题目要求返回的数值范围应在 [-2^{31}, 2^{31} - 1],因此需要考虑数字越界问题。而由于题目指出 环境只能存储 32 位大小的有符号整数 ,因此判断数字越界时,要始终保持 res 在 int 类型的取值范围内。
*/
char[] c = str.trim().toCharArray();//出掉开头空格,并转换成字符数组
if(c.length == 0)
return 0;
int res = 0;
int bndry = Integer.MAX_VALUE / 10;//这个是为了防止越界,做的处理
int i = 1;//i表示指向字符数组的下标位置
int sign = 1;//表示正负数的一个标志
if(c[0] == '-')
sign = -1;//表示最后这个数是一个负数
else if(c[0] != '+')
i = 0;//表示从字符数组的下标0开始循环
for(int j = i; j < c.length; j++) {
if(c[j] < '0' || c[j] > '9')
break;//则开头部分并不是数字,则不需要进行转换,直接返回0
if(res > bndry || res == bndry && c[j] > '7') //这里是做了越界的处理
return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
res = res * 10 + (c[j] - '0');//这个就是将字符转换为正数的转换公式
}
return sign * (int)res;
}
}
代码二:
class Solution {
public int strToInt(String str) {
if(str==null) {
return 0;
}
int n = str.length();
int i = 0;
int res = 0;
boolean is_negative = false;
//第一步,跳过前面若干个空格
while(i<n && str.charAt(i)==' ') {
++i;
}
//如果字符串全是空格直接返回
if(i==n) {
return 0;
}
//第二步,判断正负号
if(str.charAt(i)=='-') {
is_negative = true;
}
//如果是正负号,还需要将指针i,跳过一位
if(str.charAt(i)=='-' || str.charAt(i)=='+') {
++i;
}
//第三步,循环判断字符是否在 0~9之间
while(i<n && str.charAt(i)>='0' && str.charAt(i)<='9') {
//'0'的ASCII码是48,'1'的是49,这么一减就从就可以得到真正的整数值
int tmp = str.charAt(i)-48;
//判断是否大于 最大32位整数
if(!is_negative &&(res>214748364 ||(res==214748364 && tmp>=7))) {
return 2147483647;
}
//判断是否小于 最小32位整数
if(is_negative &&(-res<-214748364 || (-res==-214748364 && tmp>=8))) {
return -2147483648;
}
res = res*10 + tmp;
++i;
}
//如果有负号标记则返回负数
if(is_negative) {
return -res;
}
return res;
}
}