8. 字符串转换整数 (atoi)

题目描述

给你一个 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);

    }
}

难点

  1. 各个条件的判断
  2. 提前判断会不会超int整数型的范围
  3. sign记号的使用
  4. 从前往后,要乘10;(ans=ans10+sign(currChar-‘0’));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值