题目描述
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-231 <= x <= 231 - 1
通过次数1,160,314提交次数3,276,552
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-integer
题解
import java.util.Scanner;
public class Solution8 {
public static int myAtoi(String str){
int len=str.length();
char[] charArray=str.toCharArray();
int index=0;
//去除签到空格
while(index<len && charArray[index]==' '){
index++;
}
//如果遍历完了,针对比较极端的情况,全是空格的字符串
if(index==len){
return 0;
}
//如果出现符号字符,仅第一个有效,并记录正负
int sign=1;
char firstChar=charArray[index];
if(firstChar=='+'){
index++;
}else if(firstChar=='-'){
index++;
sign=-1;
}
//将后续出现的数字字符转换为整数
int res=0;
while(index<len){
char currChar=charArray[index];
//判断字符是否是合法的数字字符
if(currChar<'0'||currChar>'9'){
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;
}
//所有情况都合法的条件下,才考虑转换,把每一步的符号都乘进去
res=res*10+(currChar-'0')*sign;
index++;
}
return res;
}
public static void main(String [] args){
Scanner in=new Scanner(System.in);
String str=in.nextLine();//记住Java输入字符串的用法
int ans=myAtoi(str);
System.out.println(ans);
}
}
难点
- 各个条件的判断
- 提前判断会不会超int整数型的范围
- sign记号的使用
- 从前往后,要乘10;(ans=ans10+sign(currChar-‘0’));