LeetCode算法题之8:String to Integer (atoi)

7 篇文章 0 订阅
7 篇文章 0 订阅

LeetCode之8:String to Integer (atoi)

问题描述:

在这里插入图片描述
将字符串转换为合法的数字。题目地址

问题的陷阱与难点:

  1. 思路很好想,但是鲁棒性,鲁棒性,鲁棒性!!!

缺陷代码(99.50%)

public int myAtoi(String str) {
    if (str == null || str.length() ==0) {
      return 0;
    }
    int index = 0;
    int signalIndex = -1;
    boolean firstNonEmpty = true;
    while (index < str.length() && (str.charAt(index) < '0' || str.charAt(index) > '9')) {
      char current = str.charAt(index);
      //解决"words and 987",首个非空字符为非数字
      if (current != ' ' && current != '+' && current != '-' && firstNonEmpty) {
        firstNonEmpty = false;
        return 0;
      }
      if (current == '+' || current == '-') {
        signalIndex = index;
      }
      index ++;
    }
    if (index >= str.length()) {
      return 0;
    }
    long negative = 1L;
    //解决"+ 99",符号位与数字有间隔
    if (signalIndex >=0 && index - signalIndex > 1) {
      return 0;
    }
    if (index > 0) {
      char signal = str.charAt(index - 1);
      if (signal == '-') {
        negative = -1L;
      }
      //解决"++999",连续多个符号位
      if (index > 1 && (signal == '+' || signal == '-')) {
        char temp =  str.charAt(index - 2);
        if (temp == '+' || temp == '-') {
          return 0;
        }
      }
    }
    long result = 0L;
    while (index < str.length() && str.charAt(index) >= '0' && str.charAt(index) <= '9') {
      result = result * 10L + (long)(str.charAt(index) - '0');
      //解决越界问题,使用long存储数字也可能是不足够的。
      if (result >= Integer.MAX_VALUE && negative == 1) {
        return Integer.MAX_VALUE;
      } else if (result <= Integer.MIN_VALUE && negative == -1) {
        return Integer.MIN_VALUE;
      }
      index ++;
    }
    result = result * negative;
    if (result >= Integer.MAX_VALUE) {
      return Integer.MAX_VALUE;
    } else if (result <= Integer.MIN_VALUE) {
      return Integer.MIN_VALUE;
    } else {
      return (int) result;
    }
  }

思路

这道题主要考察的是鲁棒性。 思路是定位到符号位以及第一个数字位。下面只强调一下鲁棒性可能被遗忘的点。

  • 解决"+ 99",符号位与数字有间隔
  • 解决"++999",连续多个符号位
  • 解决越界问题,使用long存储中间的计算结果也可能是不足够的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值