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