返回介绍

solution / 0000-0099 / 0008.String to Integer (atoi) / README

发布于 2024-06-17 01:04:41 字数 7002 浏览 0 评论 0 收藏 0

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

English Version

题目描述

请你来实现一个 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. 返回整数作为最终结果。

注意:

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

 

示例 1:

输入:s = "42"
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
第 1 步:"42"(当前没有读入字符,因为没有前导空格)
     ^
第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
     ^
第 3 步:"42"(读入 "42")
       ^
解析得到整数 42 。
由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42 。

示例 2:

输入:s = "   -42"
输出:-42
解释:
第 1 步:"   -42"(读入前导空格,但忽视掉)
      ^
第 2 步:"   -42"(读入 '-' 字符,所以结果应该是负数)
       ^
第 3 步:"   -42"(读入 "42")
         ^
解析得到整数 -42 。
由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42 。

示例 3:

输入:s = "4193 with words"
输出:4193
解释:
第 1 步:"4193 with words"(当前没有读入字符,因为没有前导空格)
     ^
第 2 步:"4193 with words"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
     ^
第 3 步:"4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止)
       ^
解析得到整数 4193 。
由于 "4193" 在范围 [-231, 231 - 1] 内,最终结果为 4193 。

 

提示:

  • 0 <= s.length <= 200
  • s 由英文字母(大写和小写)、数字(0-9)、' ''+''-''.' 组成

解法

方法一:遍历字符串

我们首先判断字符串是否为空,如果是,直接返回 $0$。

否则,我们需要遍历字符串,跳过前导空格,判断第一个非空格字符是否为正负号。

接着遍历后面的字符,如果是数字,我们判断添加该数字是否会导致整数溢出,如果会,我们根据正负号返回结果。否则我们将数字添加到结果中。继续遍历后面的字符,直到遇到非数字字符或者遍历结束。

遍历结束后,我们根据正负号返回结果。

时间复杂度 $O(n)$,其中 $n$ 为字符串的长度。我们只需要依次处理所有字符。空间复杂度 $O(1)$。

面试题 67. 把字符串转换成整数

class Solution:
  def myAtoi(self, s: str) -> int:
    if not s:
      return 0
    n = len(s)
    if n == 0:
      return 0
    i = 0
    while s[i] == ' ':
      i += 1
      # 仅包含空格
      if i == n:
        return 0
    sign = -1 if s[i] == '-' else 1
    if s[i] in ['-', '+']:
      i += 1
    res, flag = 0, (2**31 - 1) // 10
    while i < n:
      # 非数字,跳出循环体
      if not s[i].isdigit():
        break
      c = int(s[i])
      # 溢出判断
      if res > flag or (res == flag and c > 7):
        return 2**31 - 1 if sign > 0 else -(2**31)
      res = res * 10 + c
      i += 1
    return sign * res
class Solution {
  public int myAtoi(String s) {
    if (s == null) return 0;
    int n = s.length();
    if (n == 0) return 0;
    int i = 0;
    while (s.charAt(i) == ' ') {
      // 仅包含空格
      if (++i == n) return 0;
    }
    int sign = 1;
    if (s.charAt(i) == '-') sign = -1;
    if (s.charAt(i) == '-' || s.charAt(i) == '+') ++i;
    int res = 0, flag = Integer.MAX_VALUE / 10;
    for (; i < n; ++i) {
      // 非数字,跳出循环体
      if (s.charAt(i) < '0' || s.charAt(i) > '9') break;
      // 溢出判断
      if (res > flag || (res == flag && s.charAt(i) > '7'))
        return sign > 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
      res = res * 10 + (s.charAt(i) - '0');
    }
    return sign * res;
  }
}
func myAtoi(s string) int {
  i, n := 0, len(s)
  num := 0

  for i < n && s[i] == ' ' {
    i++
  }
  if i == n {
    return 0
  }

  sign := 1
  if s[i] == '-' {
    sign = -1
    i++
  } else if s[i] == '+' {
    i++
  }

  for i < n && s[i] >= '0' && s[i] <= '9' {
    num = num*10 + int(s[i]-'0')
    i++
    if num > math.MaxInt32 {
      break
    }
  }

  if num > math.MaxInt32 {
    if sign == -1 {
      return math.MinInt32
    }
    return math.MaxInt32
  }
  return sign * num
}
const myAtoi = function (str) {
  str = str.trim();
  if (!str) return 0;
  let isPositive = 1;
  let i = 0,
    ans = 0;
  if (str[i] === '+') {
    isPositive = 1;
    i++;
  } else if (str[i] === '-') {
    isPositive = 0;
    i++;
  }
  for (; i < str.length; i++) {
    let t = str.charCodeAt(i) - 48;
    if (t > 9 || t < 0) break;
    if (ans > 2147483647 / 10 || ans > (2147483647 - t) / 10) {
      return isPositive ? 2147483647 : -2147483648;
    } else {
      ans = ans * 10 + t;
    }
  }
  return isPositive ? ans : -ans;
};
// https://leetcode.com/problems/string-to-integer-atoi/

public partial class Solution
{
  public int MyAtoi(string str)
  {
    int i = 0;
    long result = 0;
    bool minus = false;
    while (i < str.Length && char.IsWhiteSpace(str[i]))
    {
      ++i;
    }
    if (i < str.Length)
    {
      if (str[i] == '+')
      {
        ++i;
      }
      else if (str[i] == '-')
      {
        minus = true;
        ++i;
      }
    }
    while (i < str.Length && char.IsDigit(str[i]))
    {
      result = result * 10 + str[i] - '0';
      if (result > int.MaxValue)
      {
        break;
      }
      ++i;
    }
    if (minus) result = -result;
    if (result > int.MaxValue)
    {
      result = int.MaxValue;
    }
    if (result < int.MinValue)
    {
      result = int.MinValue;
    }
    return (int)result;
  }
}
class Solution {
  /**
   * @param string $s
   * @return int
   */

  function myAtoi($s) {
    $s = str_replace('e', 'x', $s);
    if (intval($s) < pow(-2, 31)) {
      return -2147483648;
    }
    if (intval($s) > pow(2, 31) - 1) {
      return 2147483647;
    }
    return intval($s);
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文