LC8:字符串转换整数

 题目理解
这道题要求我们实现一个函数,将字符串转换为整数,类似于很多编程语言中的 `atoi` 函数。

 解题思路
我们可以将解题过程分为以下几个步骤:

1. **处理前导空格**
   - 使用 `lstrip()` 方法去除字符串开头的空格

2. **处理符号**
   - 检查第一个字符是否为 '+' 或 '-'
   - 如果是 '-',记录符号为负
   - 如果是 '+',记录符号为正
   - 如果都不是,默认为正

3. **提取数字**
   - 从符号后的位置开始遍历字符串
   - 遇到非数字字符就停止
   - 将每个数字字符转换为对应的数值,并累加到结果中

4. **处理边界情况**
   - 32位整数的范围是 [-2^31, 2^31-1]
   - 如果结果超出这个范围,需要返回对应的边界值

 代码讲解
让我们逐步分析代码的实现:


 

def myAtoi(self, s: str) -> int:
    # 1. 处理前导空格
    s = s.lstrip()  # 去除字符串左边的所有空格
    if not s:  # 如果处理完空格后字符串为空,直接返回0
        return 0
    
    # 2. 处理符号
    sign = 1  # 默认为正数
    start = 0  # 开始处理数字的位置
    if s[0] == '-':  # 如果第一个字符是负号
        sign = -1    # 记录负号
        start = 1    # 从第二个字符开始处理数字
    elif s[0] == '+':  # 如果第一个字符是正号
        start = 1      # 从第二个字符开始处理数字
        
    # 3. 处理数字
    num = 0
    for i in range(start, len(s)):
        if not s[i].isdigit():  # 如果遇到非数字字符,立即停止
            break
        # 将当前数字乘以10(向左移一位)并加上新的数字
        num = num * 10 + int(s[i])
        
    # 4. 添加符号
    num = sign * num
    
    # 5. 处理边界情况
    return max(min(num, 2**31 - 1), -2**31)  # 确保结果在32位整数范围内

 示例演示
让我们用一个例子来说明整个过程:

输入:s = "   -42"

步骤1:去除空格后 → "-42"
步骤2:检测到负号,sign = -1,start = 1
步骤3:遍历数字
  - 第一次循环:num = 0 * 10 + 4 = 4
  - 第二次循环:num = 4 * 10 + 2 = 42
步骤4:添加符号 num = -42
步骤5:-42在范围内,直接返回
 

 复杂度分析
- 时间复杂度:O(n),其中 n 是字符串的长度
- 空间复杂度:O(1),只使用了常数级别的额外空间

 注意事项
1. 要注意处理空字符串的情况
2. 注意处理正负号
3. 遇到非数字字符要立即停止
4. 不要忘记处理整数溢出的情况

这道题虽然看起来简单,但需要考虑的边界情况比较多,是一道很好的字符串处理练习题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值