字符串转换整数(atoi)-java

本文介绍了如何编写一个类似于C/C++的myAtoi函数,将输入的字符串转换为32位有符号整数,处理正负号、前导空格、数字字符溢出以及整数范围限制。
摘要由CSDN通过智能技术生成

题目描述:(力扣题库8)

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

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

  1. 读入字符串并丢弃无用的前导空格
  2. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
  3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  4. 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
  5. 如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
  6. 返回整数作为最终结果。

注意:

  • 本题中的空白字符只包括空格字符 ' ' 。
  • 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

示例 :

输入:s = "   -42"
输出:-42
解释:
第 1 步:"   -42"(读入前导空格,但忽视掉)
            ^
第 2 步:"   -42"(读入 '-' 字符,所以结果应该是负数)
             ^
第 3 步:"   -42"(读入 "42")
               ^
解析得到整数 -42 。
由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42 。
  • 解题思路:
  • 文章标题咋一看感觉很简单, 但看到题目描述后,又感觉有点复杂了. 其实这个题目的代码是非常简单的,只是题目描述了一大堆, 期望规范我们的代码罢了. 整体思路还是很简单的, 将字符串的字符提取出来转换成整数, 然后依据题目要求, 注意一下细节就行了.

  • 解题步骤: 
  • 1.处理空字符串情况
  • 首先检查输入的字符串是否为空,如果为空则直接返回0。

    •     if (str == null || str.length() == 0) {
              return 0;
          }
      

  •  2.初始化变量
    • index:用于遍历字符串的索引。
    • sign:记录正负号,默认为1表示正数。
    • result:存储最终转换得到的整数。
    • maxDiv10:记录整型数除以10的最大值,用于后续检查溢出情况。
    •     int index = 0;
          int sign = 1;
          int result = 0;
          int maxDiv10 = Integer.MAX_VALUE / 10;
      

  • 3.跳过前导空格
  • 遍历字符串,跳过前导空格。

    •     while (index < str.length() && str.charAt(index) == ' ') {
          index++;
      }
      

    •  这里要注意不要把 index < str.length()  丢了, 在处理字符串时,我们需要确保我们不会访问超出字符串长度的索引,否则会导致越界异常。因此,在处理字符串中的字符时,我们通常会在访问字符之前添加条件检查以确保我们在字符串范围内。

      • 如果我们不添加 index < str.length() 的条件检查,在 str.charAt(index) 中的 index 可能会超出字符串的长度,这将致 StringIndexOutOfBoundsException 异常。如下图所示: 

    • 4. 处理正负号
    • 如果遇到正负号,则更新sign的值。如果是负号,则sign为-1,否则为1。

    • 注意, 这里和第三个步骤一样,不要把 index < str.length()  丢了!!!!!!!!!!

      •     // 处理正负号
        if (index < str.length() && (str.charAt(index) == '+' || str.charAt(index) == '-')) {
            sign = (str.charAt(index) == '-') ? -1 : 1;
            index++;
        }
        

    • 5.将字符转换为数字
      • 遍历字符串中的字符,将字符转换为数字。

      • 检查溢出:在每次迭代中,检查是否会导致整数溢出。

      • 如果 result 大于 maxDiv10 ,或者 result 等于 maxDiv10 且当前数字大于 7(因为 Integer.MAX_VALUE 的个位数是 7 ),则返回 Integer.MAX_VALUE Integer.MIN_VALUE

      • 否则,更新result的值。

        • // 将字符转换为数字
          while (index < str.length() && Character.isDigit(str.charAt(index))) {
              int digit = str.charAt(index) - '0';
          
              // 检查溢出
              if (result > maxDiv10 || (result == maxDiv10 && digit > 7)) {
                  return (sign == 1) ? Integer.MAX_VALUE : Integer.MIN_VALUE;
              }
          
              result = result * 10 + digit;
              index++;
          }

    • 6.返回结果最终返回 sign * result ,即根据正负号返回转换后的整数值。

      • return sign * result;

    • 以下是完整代码: 
      • class Solution {
            public int myAtoi(String str) {
            if (str == null || str.length() == 0) {
                return 0;
            }
        
            int index = 0;
            int sign = 1;
            int result = 0;
            int maxDiv10 = Integer.MAX_VALUE / 10;
        
            // 跳过前导空格
            while (index < str.length() && str.charAt(index) == ' ') {
                index++;
            }
        
            // 处理正负号
            if (index < str.length() && (str.charAt(index) == '+' || str.charAt(index) == '-')) {
                sign = (str.charAt(index) == '-') ? -1 : 1;
                index++;
            }
        
            // 将字符转换为数字
            while (index < str.length() && Character.isDigit(str.charAt(index))) {
                int digit = str.charAt(index) - '0';
        
                // 检查溢出
                if (result > maxDiv10 || (result == maxDiv10 && digit > 7)) {
                    return (sign == 1) ? Integer.MAX_VALUE : Integer.MIN_VALUE;
                }
        
                result = result * 10 + digit;
                index++;
            }
        
            return sign * result;
        }
        
        
        }

      • 以上就是本篇文章的全部内容,该偏博客文字讲述偏多,也掺杂了博主自己的一些想法与见解,内容如若有不妥之处,敬请谅解.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值