008字符串转换整数
写在前面,参考的是力扣官网的解题思路,好懂和图解
一、java代码
/*
* @lc app=leetcode.cn id=8 lang=java
*
* [8] 字符串转换整数 (atoi)
*/
// @lc code=start
class Solution {
public int myAtoi(String str) {
//字符串转换为数组
char[] chars=str.toCharArray();
//数组长度
int n=chars.length;
//数组下标
int idx=0;
//去掉前导空格
while(idx<n&&chars[idx]==' '){
idx++;
}
//如果去掉前导空格后就到末尾了,则直接返回0
if(idx==n){
return 0;
}
//negative标记负号
boolean negative=false;
//判断第一个非空字符
//如果遇到负号则记录下状态
if(chars[idx]=='-'){
negative=true;
idx++;
//如果遇到正号,可以忽略
}else if(chars[idx]=='+'){
idx++;
//其他符号,则直接返回0
}else if(!Character.isDigit(chars[idx])){
return 0;
}
//输出的数,先定义为0
int ans=0;
//Character.isDigit判断是否为数字
while (idx<n&&Character.isDigit(chars[idx])){
//将字符数字转换为数字'1'-'0'=1
int digit=chars[idx]-'0';
//也就是说会在某一步`ans*10+digit>Integer.MAX_VALUE`
//`*10`和`+digit`都可能会越界,那么只要把这些都移到右边去就可以了
if(ans>(Integer.MAX_VALUE-digit)/10){
return negative?Integer.MIN_VALUE:Integer.MAX_VALUE;
}
//最基本的基本
ans=ans*10+digit;
//下标自增
idx++;
}
return negative?-ans:ans;
}
}
// @lc code=end
二、题解分析
做题思路
1、去掉前导空格
2、处理正负号
3、识别数字,注意越界的情况
代码解释
1、这道题如果只是简单的字符串转换整数的话,就是简单的ans=ans*10+digit
2、但是这道题可能会超过integer的最大表示
3、也就是说会在某一步ans*10+digit>Integer.MAX_VALUE
-
*10
和+digit
都可能会越界,那么只要把这些都移到右边去就可以了 -
ans>(Integer.MAX_VALUE-digit)/10
就是越界