当前位置: 面试刷题>> 转换字符串到整数 (经典算法题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 (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 代码示例 ```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 代码示例 ```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")); ``` 码小课网站中有更多相关内容分享给大家学习,欢迎访问。
推荐面试题