算法通关村第十二关——字符串转换整数

LeetCode8. 请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个32位有符号整数(类似C/C++中的atoi函数)。

我们要先考虑一些极端的情况,输入的字符串中有一堆没用的空格,需要跳过这些空格,如果输入的字符串中全是空格的话,就要加一个判断语句,如果当前索引等于字符串长度,返回。

如果字符串中的数字是带符号的,也要先一步进行处理。

在最后将每一位转换成数字的时候要带着sign乘。

对于输入的 -123,代码会按照以下步骤进行处理:

  1. firstChar 为 '-',将 sign 设为 -1,并将索引 index 增加 1。
  2. charArray[index] 为 '1',将其转换为整数 1 并乘以 sign 的值 -1,得到 -1,累加到 res 中。
  3. 继续检查下一个字符 '2',将其转换为整数 2 并乘以 -1,得到 -2,累加到 res 中。
  4. 继续检查下一个字符 '3',将其转换为整数 3 并乘以 -1,得到 -3,累加到 res 中。

最终,res 的值会是 -123

因此,在乘法操作中,需要将符号位 sign 乘进去,以处理负数的情况。

public static int myAtoi(String str) {
    int len = str.length();
    char[] charArray = str.toCharArray();
    
    // 1. 去除前导空格
    int index = 0;
    while (index < len && charArray[index] == ' ') {
        index++;
    }
    
    // 2. 如果已经遍历完成(针对极端用例"     ")
    if (index == len) {
        return 0;
    }
    
    // 3. 如果出现符号字符,仅第 1 个有效,并记录正负
    int sigh = 1;
    char firstChar = charArray[index];
    if (firstChar == '+') {
        index++;
    } else if (firstChar == '-') {
        index++;
        sign = -1;
    }
    
    // 4. 将后续出现的数字字符进行转换
    // 不能使用 long 类型,这是题目说的
    int res = 0;
    while (index < len) {
        char currChar = charArray[index];
        // 4.1 先判断不合法的情况
        if (currChar > '9' || currChar < '0') {
            break;
        }
        
        // 题目中说只能存储 32 位大小的有符号整数,下面两个if分别处理整数和负数的情况。
        // 提前判断乘以10以后是否越界,但res*10可能会越界,所以这里使用Integer.MAX_VALUE/10,这样一定不会月结
        // 这是解决溢出问题的经典处理方式
        if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (currChar - '0') > Integer.MAX_VALUE % 10)) {
            return Integer.MAX_VALUE;
        }
        if (res > Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (currChar - '0') > (-Integer.MIN_VALUE % 10))) {
            return Integer.MIN_VALUE;
        }
        
        // 合法的情况下,才考虑转换,每一步都把符号位乘进去
        // 想想这里为什么要带着sign乘
        res = res * 10 + sign * (currChar - '0');
        index++;
    }
    return res;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值