当前位置: 面试刷题>> 转换字符串到整数 (经典算法题500道)


题目描述

题目: 转换字符串到整数(String to Integer Atoi)

题目要求

实现一个函数,该函数将字符串转换为整数。字符串可能包含空白字符,正负号,以及可能超出整型范围(32位有符号整数)的数值。转换时需要忽略字符串开头的空白字符,直到遇到第一个非空字符为止。如果第一个非空字符是正负号,则跟随的字符直到下一个空白字符为止,都应当被解析为整数;如果第一个非空字符是数字,则应当解析直到下一个非数字字符为止。字符串中的有效字符将被转换为整数(即 "123.456" 将被解析为 "123",而 "123abc" 将被解析为 "123")。

假设我们的环境只能存储 32 位有符号整数,因此其数值范围为 [−2^31, 2^31 − 1]。如果数值超出这个范围,则返回 INT_MAX (2^31 − 1) 或 INT_MIN (−2^31)。

示例 1:

输入: "42"
输出: 42

示例 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符是 '-', 它是一个负号。
     我们尽可能解析直到下一个非数字字符,得到 "42"。
     答案是 -42。

示例 3:

输入: "4193 with words"
输出: 4193
解释: 转换直到 "with" 之前的数字为止。

示例 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 它不是数字或正负号,因此无法解析任何数字。

示例 5:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超出 32 位有符号整数范围。
     因此返回 INT_MIN (−2^31)。

PHP 代码示例

<?php

function myAtoi($str) {
    $str = trim($str); // 去除字符串两端的空白字符
    $result = 0;
    $sign = 1;
    $i = 0;
    $maxLength = strlen($str);

    // 处理正负号
    if ($str[$i] === '-' || $str[$i] === '+') {
        $sign = ($str[$i] === '-') ? -1 : 1;
        $i++;
    }

    // 转换数字部分
    while ($i < $maxLength && is_numeric($str[$i])) {
        $digit = intval($str[$i]);

        // 检查是否超出范围
        if ($result > (PHP_INT_MAX - $digit) / 10) {
            return ($sign === 1) ? PHP_INT_MAX : PHP_INT_MIN;
        }

        $result = $result * 10 + $digit;
        $i++;
    }

    return $result * $sign;
}

// 测试
echo myAtoi("42") . "\n";
echo myAtoi("   -42") . "\n";
echo myAtoi("4193 with words") . "\n";
echo myAtoi("words and 987") . "\n";
echo myAtoi("-91283472332") . "\n";

?>

Python 代码示例

def myAtoi(s: str) -> int:
    s = s.strip()
    result = 0
    sign = 1
    i = 0

    # 处理正负号
    if s[i] in ['-', '+']:
        sign = -1 if s[i] == '-' else 1
        i += 1

    # 转换数字部分
    while i < len(s) and s[i].isdigit():
        digit = int(s[i])
        
        # 检查是否超出范围
        if result > (2**31 - 1) // 10 or (result == (2**31 - 1) // 10 and digit > 7):
            return sign * 2**31 - 1
        if result < -(2**31) // 10 or (result == -(2**31) // 10 and digit > 8):
            return sign * -2**31
        
        result = result * 10 + digit
        i += 1

    return sign * result

# 测试
print(myAtoi("42"))
print(myAtoi("   -42"))
print(myAtoi("4193 with words"))
print(myAtoi("words and 987"))
print(myAtoi("-91283472332"))

JavaScript 代码示例

function myAtoi(str) {
    str = str.trim();
    let result = 0;
    let sign = 1;
    let i = 0;

    // 处理正负号
    if (str[i] === '-' || str[i] === '+') {
        sign = (str[i] === '-') ? -1 : 1;
        i++;
    }

    // 转换数字部分
    while (i < str.length && !isNaN(str[i]) && str[i] !== ' ') {
        const digit = parseInt(str[i]);

        // 检查是否超出范围
        if (result > Math.pow(2, 31) / 10 || (result === Math.pow(2, 31) / 10 && digit > 7)) {
            return sign === 1 ? Math.pow(2, 31) - 1 : -Math.pow(2, 31);
        }
        if (result < -Math.pow(2, 31) / 10 || (result === -Math.pow(2, 31) / 10 && digit > 8)) {
            return -Math.pow(2, 31);
        }

        result = result * 10 + digit;
        i++;
    }

    return result * sign;
}

// 测试
console.log(myAtoi("42"));
console.log(myAtoi("   -42"));
console.log(myAtoi("4193 with words"));
console.log(myAtoi("words and 987"));
console.log(myAtoi("-91283472332"));

码小课网站中有更多相关内容分享给大家学习,欢迎访问。

推荐面试题