乘風破浪:LeetCode真題_008_String to Integer (atoi)
阿新 • • 發佈:2019-01-02
乘風破浪:LeetCode真題_008_String to Integer (atoi)
一、前言
將整型轉換成字串,或者將字串轉換成整型,是經常出現的,也是必要的,因此我們需要熟練的掌握,當然也有很多工具來實現了,但是在這個基礎上加入一些其他的因素就是考點的所在了。
二、String to Integer (atoi)
2.1 問題理解
2.2 問題分析和解決
看到這個問題,我們就需要遍歷字串,然後判斷開始的時候是不是空格,+,-,或者數字,如果不是的話就是不合理的,如果是,則繼續向後遍歷,直至遇到其他字元為止,將這之間的內容儲存下來,並且轉換成整型資料。如果發現大於整型的範圍則根據正負返回相應的結果。
我們的程式碼:
1 public class Solution { 2 3 public int myAtoi(String str) { 4 5 if (str == null || str.length() == 0) { 6 return 0; 7 } 8 9 // 如果字串以空格開始 10 int start = 0; //從開始找第一個不是空格的數 11 boolean positive = true; // 是否為正數預設為true 12 13 if (str.charAt(start) == ' ') { 14 while (str.charAt(start) == ' ') { 15 start++; 16 if (start >= str.length()) { // 輸入的全是空格 17 return 0; 18 } 19 } 20 } 21 22if (str.charAt(start) == '-') { // 第一個非空白字元中- 23 positive = false; 24 start++; 25 } else if (str.charAt(start) == '+') {// 第一個非空白字元是+ 26 start++; 27 } else if (str.charAt(start) >= '0' && str.charAt(start) <= '9') { // 第一個非空白字元是數字 28 return cal(str, start, true); 29 } else { // 其它情況就丟擲異常 30 return 0; 31 } 32 33 if (start >= str.length()) { // 第一個非空白字元是+或者-但也是最後一個字元 34 return 0; 35 } 36 37 if (str.charAt(start) > '9' || str.charAt(start) < '0') { // +或者-後面接的不是數字 38 return 0; 39 } else { 40 return cal(str, start, positive); 41 } 42 } 43 44 private int cal(String str, int start, boolean positive) { 45 46 long result = 0; 47 while (start < str.length() && str.charAt(start) >= '0' && str.charAt(start) <= '9') { 48 result = result * 10 + (str.charAt(start) - '0'); 49 50 if (positive) { // 如果是正數 51 if (result > Integer.MAX_VALUE) { 52 return Integer.MAX_VALUE; 53 } 54 } else { 55 if (-result < Integer.MIN_VALUE) { 56 return Integer.MIN_VALUE; 57 } 58 } 59 60 start++; 61 } 62 63 if (positive) { 64 return (int) result; 65 } else { 66 return (int) -result; 67 } 68 } 69 }
三、總結
通過這樣的實踐,使得我們對於一些細節上的東西有了更深刻的認識,比如越界問題,比如正負號問題,以及正負號之後是不是數字,空格等等的解決方法。