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

原题描述

原题地址:字符串转换整数 (atoi)

我的题解: java 模拟 一次遍历 详细注释

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

  1. 读入字符串并丢弃无用的前导空格

  1. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。

  1. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。

  1. 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。

  1. 如果整数数超过 32 位有符号整数范围 [−, − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 − 的整数应该被固定为 − ,大于 − 1 的整数应该被固定为 − 1 。

  1. 返回整数作为最终结果。

示例 1:
输入:s = "42"
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
第 1 步:"42"(当前没有读入字符,因为没有前导空格)

^ 第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
^
第 3 步:" 42"(读入 "42")

^
解析得到整数 42 。
由于 "42" 在范围 [- , - 1] 内,最终结果为 42
示例 2:

输入:s = "4193 with words"
输出:4193
解释:
第 1 步:"4193 with words"(当前没有读入字符,因为没有前导空格)

^
第 2 步:"4193 with words"(当前没有读入字符,因为这里不存在 '-' 或者 '+')

^
第 3 步:" 4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止)

^
解析得到整数 4193 。
由于 "4193" 在范围 [- , - 1] 内,最终结果为 4193 。
解题思路

按题目步骤处理数据index记录处理位置,end记录数字字符结束的位,sign记录数据的符号。

  1. 读入字符串并丢弃无用的前导空格

 //1.读入字符串并丢弃无用的前导空格
for (int i = 0; i < s.length(); i++) {
    if (s.charAt(i)==' '){
            index=i+1;
        }else {
         break;
   }
}
  1. 检查下一个字符(假设还未到字符末尾)为正还是负号, 读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。

 String sign = "+";
    if (index<s.length()){
        if (s.charAt(index)=='-'){
            sign="-";
            index++;
        }else if (s.charAt(index)=='+'){
            index++;
    }
 }
  1. 读入字符串并丢弃无用的前导0

for (int i = index; i < s.length(); i++) {
       if (s.charAt(i)=='0'){
         index=i+1;
       }else {
             break;
       }
  }
  1. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。

int end=index;
for (int i = index; i < s.length(); i++) {
    if (s.charAt(i)<'0'||s.charAt(i)>'9'){
        end=i;
        break;
        }
    end=i+1;
}
  1. 处理数字,截取字符串前数字部分,并加上第二部解析已经解析的符号sign。

 String num="0";
  if (end>index){
       num = sign+s.substring(index,end);
   } 
  1. 如果整数数超过 32 位有符号整数范围 [−, − 1],需要截断这个整数,使其保持在这个范围内。具体来说,小于 − 的整数应该被固定为 − ,大于 − 1的整数应该被固定为 − 1 。

  • 大于11位

if (num.length()>11){
    if (sign.equals("-")){
        ans = Integer.MIN_VALUE;
    }else {
        ans = Integer.MAX_VALUE;
    }
}
  • 等于11位

if (num.length()==11){  
   if (sign.equals("-")&&num.compareTo("-2147483648")>=0){
        ns = Integer.MIN_VALUE;
    }else if(sign.equals("+")&&num.compareTo("+2147483647")>=0){
        ans = Integer.MAX_VALUE;
        }else {
        ans = Integer.valueOf(num);
    }
}
  • 小于11位

 ans = Integer.valueOf(num);
  1. 返回处理结果

复杂度
  • 时间复杂度: O(n)

  • 空间复杂度: O(1)

Code

class Solution {
 public  int myAtoi(String s) {
        int ans=0;
       //1.读入字符串并丢弃无用的前导空格
        int index = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i)==' '){
                index=i+1;
            }else {
                break;
            }
        }
        // 2.检查下一个字符(假设还未到字符末尾)为正还是负号,
        // 读取该字符(如果有)。 确定最终结果是负数还是正数。
        // 如果两者都不存在,则假定结果为正。
        String sign = "+";
       if (index<s.length()){
           if (s.charAt(index)=='-'){
               sign="-";
               index++;
           }else if (s.charAt(index)=='+'){
               index++;
           }
       }
        //3.读入字符串并丢弃无用的前导0
        for (int i = index; i < s.length(); i++) {
            if (s.charAt(i)=='0'){
                index=i+1;
            }else {
                break;
            }
        }
        //4.读入下一个字符,
        // 直到到达下一个非数字字符或到达输入的结尾。
        // 字符串的其余部分将被忽略。
        int end=index;
        for (int i = index; i < s.length(); i++) {
            if (s.charAt(i)<'0'||s.charAt(i)>'9'){
                end=i;
                break;
            }
            end=i+1;
        }
        //5.处理数字,截取字符串前数字部分,并加上第二部解析已经解析的符号sign。
        String num="0";
        if (end>index){
            num = sign+s.substring(index,end);
        }
     
        //6.如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,
        // 需要截断这个整数,使其保持在这个范围内。具体来说,
        // 小于 −231 的整数应该被固定为 −231 ,大于 231 − 1
        //的整数应该被固定为 231 − 1 。
 
      if (num.length()==11){//等于11位
            if (sign.equals("-")&&num.compareTo("-2147483648")>=0){
                ans = Integer.MIN_VALUE;
            }else if(sign.equals("+")&&num.compareTo("+2147483647")>=0){
                ans = Integer.MAX_VALUE;
            }else {
                ans = Integer.valueOf(num);
            }
        }else if (num.length()>11){//大于11位
            if (sign.equals("-")){
                ans = Integer.MIN_VALUE;
            }else {
                ans = Integer.MAX_VALUE;
            }
        }else {//小于11位
            ans = Integer.valueOf(num);
        }
        return  ans;
    }
}
执行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值