Ruby's Louvre

每天学习一点点算法

导航

leetcode 8. String to Integer (atoi)

这方法的条件有

  1. 前面可以是连续空白,但不能出现字符
  2. 前面有字符返回0
  3. 前面可以有+-
  4. 数字后面的字母会被删掉
  5. 解后的数字如果超出 [Math.pow(-2,31), Math.pow(2,31)-1], 返回这些极限值
  function myAtoi(str) {
      var map = new Array(10).fill(1).reduce((ret, el, index) => {
        ret[index] = 1
        return ret
      }, {})
      map['-'] = 1;
      map['+'] = 1;
      var hasNum = false, ret = ''
      for (var i = 0; i < str.length; i++) {
        var c = str[i]
        if (!hasNum) {
          if (map[c]) {
            ret += c;
            //符合只能匹配一次
            if (c === '+' || c == '-') {
              delete map['+']
              delete map['-']
            }
            hasNum = true
          } else {
            if (c == ' ') {
              continue
            }
            return 0
          }
        } else {
          if (map[c]) { //- + 1
            ret += c;
          } else {
            break
          }
        }
      }
      var parsedString = parseInt(ret);
      if (isNaN(parsedString)) {
        return 0;
      }
      if (parsedString >= Math.pow(2, 31)) {
        return Math.pow(2, 31) - 1;
      }

      if (parsedString < Math.pow(-2, 31)) {
        return Math.pow(-2, 31);
      }

      return parsedString
    };

    console.log(myAtoi('-91283472332'))

或者直接动用正则,将前面的有效字符匹配出来

  function myAtoi(str) {
      var a = str.match(/^\s*([+-]?\d+)/)
      if (a && a[1]) {
        var num = Number(a[1]);
        if (num < 0) {
          return Math.max(-Math.pow(2, 31), num)
        }
        return Math.min(Math.pow(2, 31) - 1, num)
      } else {
        return 0
      }
    };

JS中还能直接作弊

var myAtoi = function(str) {
   let parsedString = parseInt(str);

   if(parsedString >= Math.pow(2,31)) {
      return Math.pow(2,31) - 1;
   }

   if(parsedString < Math.pow(-2,31)) {
      return Math.pow(-2,31);
  }

   if(isNaN(parsedString)) {
      return 0;
    }

   return parsedString;
};

posted on 2019-12-14 16:27  司徒正美  阅读(268)  评论(0编辑  收藏  举报