leetCode8字符串转换整数


一段胡乱拼凑却能跑还跑得不错的代码

题目

leetCode第八题

题目理解

输入一个字符串,逐个读取字符

  • 如果开头首先n个空格,删去连续的空格(如果n == 0 ,直接下一步)
  • 空格后的第一位可以读取 数字 + -
    • +不处理,读下一个
    • -将返回值int为负数,读下一个
    • 数字将转换为int一位,读下一个
    • 如果读取到其他字母 ,直接reture 0
  • 之后只能读取数字,否则返回已经读取到的int
    • 新数字append到最后的个位数

不能溢出

解题代码

public class NO8 {
  static final int NINE_VALUE_MAX_INTEGER = 214748364;
  static final int TEN_VALUE = 1000000000;
  static final int ASCII_ZERO = 47;
  static final int ASCII_NINE = 58;

  public int myAtoi(String s) {
    int flag = 1;
    int r = 0;
    // 去除空格
    //    int j = 0;
    //    for ( j = 0; j < s.length(); j++) {
    //      if (s.charAt(j) > ASCII_ZERO && s.charAt(j) < ASCII_NINE) break;
    //      if (s.charAt(j) == '+' || s.charAt(j) == '-') break;
    //      if (s.charAt(j) == ' ') continue;
    //      if (s.charAt(j) != ' ') return 0;
    //      if (j == s.length() - 1) return 0;
    //    }
    s = s.trim();
    int count = 0;
    for (int i = 0; i < s.length(); i++) {
      if (s.charAt(0) == '-' && count == 0) {
        flag = -1;
        count++;
        continue;
      }
      if (s.charAt(0) == '+' && count == 0) {
        flag = 1;
        count++;
        continue;
      }
      if (s.charAt(i) > ASCII_ZERO && s.charAt(i) < ASCII_NINE) {
        r = s.charAt(i) - '0' + r * 10;
        if (r > NINE_VALUE_MAX_INTEGER && r < TEN_VALUE - 1) {
          if (s.charAt(i + 1) > ASCII_ZERO && s.charAt(i + 1) < ASCII_NINE)
            return flag > 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
        }
        if (i < s.length() - 1)
          if (r >= TEN_VALUE && s.charAt(i + 1) > ASCII_ZERO && s.charAt(i + 1) < ASCII_NINE)
            return flag > 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
      } else {
        return r * flag;
      }

      if (r == NINE_VALUE_MAX_INTEGER && flag == -1 && (s.charAt(i + 1) - '0') >= 8)
        return Integer.MIN_VALUE;
      if (r == NINE_VALUE_MAX_INTEGER && flag == 1 && (s.charAt(i + 1) - '0') >= 7)
        return Integer.MAX_VALUE;
    }
    return r * flag;
  }
}

结果

提交结果

总结

在写代码的过程中源代码一直觉得自己写了一手垃圾成山的代码
数次想过推翻重来
醒着头皮跑下来,时间效率竟然让我非常惊喜

  • 第一步一直在想如何去字符的开头空格,想遍历然后读到非空格之后substring,逻辑一直难以完善
    • 实际上最好的方法是设置一个int的指针或者说哨兵,读取更加方便;但是自己一开始没有使用,写了一班了就想一路黑下去,不想改了
    • 最后用了string.trim(),我看了源代码,它是首位都会判断遍历去空格(恰好符合要求),其实额外增加了复杂度,最好还是仅仅自己写出仅仅去开头空格的
  • 后面是处理数字的拼接,实际上即将到达溢出的时候使用了几个判断,个人觉得还是比较愚蠢的

本题就是属于自己头铁就按照一开始的思路写下去然后发现时间效率还不错的凑巧


文章作者: hyy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hyy !
  目录