目錄javascript
請你來實現一個 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) 。
手搓一個api
循環
字符串去除空格而後正則匹配以-+開頭數字結束的部分
直接parseint,判斷一下便可
這個辦法通用性要高不少清除空格而後判斷首位是不是數字,先實現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%的用戶