前端與算法 leetcode 8. 字符串轉換整數 (atoi)

# 前端與算法 leetcode 8. 字符串轉換整數 (atoi)

題目描述

請你來實現一個 atoi 函數,使其能將字符串轉換成整數。前端

首先,該函數會根據須要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符爲止。java

當咱們尋找到的第一個非空字符爲正或者負號時,則將該符號與以後面儘量多的連續數字組合起來,做爲該整數的正負號;假如第一個非空字符是數字,則直接將其與以後連續的數字字符組合起來,造成整數。git

該字符串除了有效的整數部分以後也可能會存在多餘的字符,這些字符能夠被忽略,它們對於函數不該該形成影響。github

注意:假如該字符串中的第一個非空格字符不是一個有效整數字符、字符串爲空或字符串僅包含空白字符時,則你的函數不須要進行轉換。算法

在任何狀況下,若函數不能進行有效的轉換時,請返回 0。api

說明:函數

假設咱們的環境只能存儲 32 位大小的有符號整數,那麼其數值範圍爲 [−231,  231 − 1]。若是數值超過這個範圍,請返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。測試

示例 1:code

輸入: "42"
輸出: 42

示例 2:

輸入: "   -42"
輸出: -42
解釋: 第一個非空白字符爲 '-', 它是一個負號。
     咱們儘量將負號與後面全部連續出現的數字組合起來,最後獲得 -42 。

示例 3:

輸入: "4193 with words"
輸出: 4193
解釋: 轉換截止於數字 '3' ,由於它的下一個字符不爲數字。

示例 4:

輸入: "words and 987"
輸出: 0
解釋: 第一個非空字符是 'w', 但它不是數字或正、負號。
     所以沒法執行有效的轉換。

示例 5:

輸入: "-91283472332"
輸出: -2147483648
解釋: 數字 "-91283472332" 超過 32 位有符號整數範圍。 
     所以返回 INT_MIN (−231) 。

8. 字符串轉換整數 (atoi)

概要

手搓一個api

提示

循環

解析

解法一:正則

字符串去除空格而後正則匹配以-+開頭數字結束的部分

解法二:api

直接parseint,判斷一下便可

解法二:手搓一個api

這個辦法通用性要高不少清除空格而後判斷首位是不是數字,先實現js版本擊敗80%,隨後在java上實現2ms,擊敗99%

算法

java解法

class Solution {
    public int myAtoi(String str) {
      if(str.isEmpty()) return 0 ;
      char[] req = str.toCharArray();
      long res = 0;
      int i=0,s=1,n=str.length();
      while(i<n&&req[i]==' '){i++;}
      if(i<n && req[i]=='+'){i++;}
      else if(i<n&&req[i]=='-'){i++;s=-1;}
      while(i<n&&(req[i]>='0'&&req[i]<='9')){
        if(res!=(int)res){
          return (s==1)?Integer.MAX_VALUE:Integer.MIN_VALUE;
        }
        res=res*10+req[i++]-'0';
      }
      if(res!=(int)res){
        return (s==1)?Integer.MAX_VALUE:Integer.MIN_VALUE;
      }
      return (int)(res*s);
    }
}

js解法

/**
 * @param {string} str
 * @return {number}
 */
var myAtoi = function (str) {
  const result = str.trim().match(/^(-|\+)?\d+/g);
  return result? Math.max(Math.min(Number(result[0]), 2 ** 31 - 1), -(2 ** 31)): 0;
  // 一行代碼解決問題
  // return parseInt(str, 10) < -(2 ** 31) ? -(2 ** 31) : (parseInt(str, 10) > (2 ** 31) - 1 ? (2 ** 31) - 1 : ((parseInt(str, 10) >= -(2 ** 31) && parseInt(str, 10) <= (2 ** 31) - 1) ? parseInt(str, 10) : 0));
  // 正經點的api俠解答
  // let result = parseInt(str, 10);
  // let max = 2 ** 31;
  // if (Number.isNaN(result)) {
  //   return 0;
  // } else if (result < 0 - max) {
  //   return 0 - max;
  // } else if (result > max - 1) {
  //   return max - 1;
  // } else {
  //   return result;
  // }
// 不調api的解法
//   str = str.trim(); // 清除空格
//   let max = 2 ** 31;
//   // 若是不是數字
//   if (!(str.charCodeAt(0) >= 48 && str.charCodeAt(0) <= 57)) {
//     if (str.charAt(0) === '+') {
//       let req = res(str, 1);
//       return req >= (max - 1) ? max - 1 : req;
//     }
//     if (str.charAt(0) === '-') {
//       let req = -(res(str, 1));
//       return req <= -max ? -max : req;
//     }
//   } else {
//     // 第一位就是數字的狀況
//     let req = res(str, 0);
//     return req >= (max - 1) ? max - 1 : req;
//   }
//   return 0;
// };
// // 解析數字,第一個參數字符串,第二個起始位置
// const res = (s, num) => {
//   let r = 0;
//   for (let i = num; i < s.length; i++) {
//     // 只接受數字
//     if (s.charCodeAt(i) <= 57 && s.charCodeAt(i) >= 48) {
//       r = r * 10 + (s.charCodeAt(i) - 48);
//     } else {
//       break;
//     }
//   }
//   // 最大值和最小值之間有差距,在這裏判斷不如結束後判斷
//   return r;
};

傳入測試用例的運行結果

input:
output:

執行結果

執行用時 :80 ms, 在全部 javascript 提交中擊敗了94.84%的用戶
內存消耗 :35.5 MB, 在全部 javascript 提交中擊敗了74.01%的用戶

GitHub倉庫

查看github倉庫 覺的騷也能夠給個星星

查看更多

查看更多題解

相關文章
相關標籤/搜索