[剑指offer]面试题第[67]题[Leetcode][JAVA][第8题] 字符串转换整数 (atoi)[字符串]
生活随笔
收集整理的這篇文章主要介紹了
[剑指offer]面试题第[67]题[Leetcode][JAVA][第8题] 字符串转换整数 (atoi)[字符串]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【問題描述】
請你來實現一個 atoi 函數,使其能將字符串轉換成整數。首先,該函數會根據需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符為止。接下來的轉化規則如下:如果第一個非空字符為正或者負號時,則將該符號與之后面盡可能多的連續數字字符組合起來,形成一個有符號整數。 假如第一個非空字符是數字,則直接將其與之后連續的數字字符組合起來,形成一個整數。 該字符串在有效的整數部分之后也可能會存在多余的字符,那么這些字符可以被忽略,它們對函數不應該造成影響。 注意:假如該字符串中的第一個非空格字符不是一個有效整數字符、字符串為空或字符串僅包含空白字符時,則你的函數不需要進行轉換,即無法進行有效轉換。在任何情況下,若函數不能進行有效的轉換時,請返回 0 。提示:本題中的空白字符只包括空格字符 ' ' 。 假設我們的環境只能存儲 32 位大小的有符號整數,那么其數值范圍為 [?231, 231 ? 1]。如果數值超過這個范圍,請返回 INT_MAX (231 ? 1) 或 INT_MIN (?231) 。示例:輸入: "-91283472332" 輸出: -2147483648 解釋: 數字 "-91283472332" 超過 32 位有符號整數范圍。 因此返回 INT_MIN (?231) 。【解答思路】
1. 考慮所有情況 空格 符號 是否數字 上界
時間復雜度:O(N) 空間復雜度:O(1)
特別注意:
1、由于題目中說「環境只能保存 32 位整數」,因此這里在每一輪循環之前先要檢查乘以 1010 以后是否溢出,具體細節請見編碼。
2、Java 、Python 和 C++ 字符串的設計都是不可變的,即使用 trim() 會產生新的變量,因此我們盡量不使用庫函數,使用一個變量 index 去做遍歷,這樣遍歷完成以后就得到轉換以后的數值。
威威的工程代碼
public class Solution {public int myAtoi(String str) {int len = str.length();// str.charAt(i) 方法回去檢查下標的合法性,一般先轉換成字符數組char[] charArray = str.toCharArray();// 1、去除前導空格int index = 0;while (index < len && charArray[index] == ' ') {index++;}// 2、如果已經遍歷完成(針對極端用例 " ")if (index == len) {return 0;}// 3、如果出現符號字符,僅第 1 個有效,并記錄正負int sign = 1;char firstChar = charArray[index];if (firstChar == '+') {index++;} else if (firstChar == '-') {index++;sign = -1;}// 4、將后續出現的數字字符進行轉換// 不能使用 long 類型,這是題目說的int res = 0;while (index < len) {char currChar = charArray[index];// 4.1 先判斷不合法的情況if (currChar > '9' || currChar < '0') {break;}// 題目中說:環境只能存儲 32 位大小的有符號整數,因此,需要提前判:斷乘以 10 以后是否越界if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (currChar - '0') > Integer.MAX_VALUE % 10)) {return Integer.MAX_VALUE;}if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (currChar - '0') > -(Integer.MIN_VALUE % 10))) {return Integer.MIN_VALUE;}// 4.2 合法的情況下,才考慮轉換,每一步都把符號位乘進去res = res * 10 + sign * (currChar - '0');index++;}return res;}public static void main(String[] args) {Solution solution = new Solution();String str = "2147483646";int res = solution.myAtoi(str);System.out.println(res);System.out.println(Integer.MAX_VALUE);System.out.println(Integer.MIN_VALUE);} }作者:liweiwei1419 鏈接:https://leetcode-cn.com/problems/string-to-integer-atoi/solution/jin-liang-bu-shi-yong-ku-han-shu-nai-xin-diao-shi-/2. 時間復雜度:O(N) 空間復雜度:O(1)
甜姨的刀法
public class Solution {public int myAtoi(String str) {char[] chars = str.toCharArray();int n = chars.length;int idx = 0;while (idx < n && chars[idx] == ' ') {// 去掉前導空格idx++;}if (idx == n) {//去掉前導空格以后到了末尾了return 0;}boolean negative = false;if (chars[idx] == '-') {//遇到負號negative = true;idx++;} else if (chars[idx] == '+') {// 遇到正號idx++;} else if (!Character.isDigit(chars[idx])) {// 其他符號return 0;}int ans = 0;while (idx < n && Character.isDigit(chars[idx])) {int digit = chars[idx] - '0';if (ans > (Integer.MAX_VALUE - digit) / 10) {// 本來應該是 ans * 10 + digit > Integer.MAX_VALUE// 但是 *10 和 + digit 都有可能越界,所有都移動到右邊去就可以了。return negative? Integer.MIN_VALUE : Integer.MAX_VALUE;}ans = ans * 10 + digit;idx++;}return negative? -ans : ans;} }作者:sweetiee 鏈接:https://leetcode-cn.com/problems/string-to-integer-atoi/solution/java-zi-fu-chuan-zhuan-zheng-shu-hao-dong-by-sweet/3.思路
class Solution {public int strToInt(String str) {char[] c = str.trim().toCharArray();if(c.length == 0) return 0;int res = 0, bndry = Integer.MAX_VALUE / 10;int i = 1, sign = 1;if(c[0] == '-') sign = -1;else if(c[0] != '+') i = 0;for(int j = i; j < c.length; j++) {if(c[j] < '0' || c[j] > '9') break;//c[j] > '7' 這里處理很巧妙,判斷 > '7' , 看似沒有考慮 MIN, 但其實無論是 = '8' ,還是 >'8',返回的都是MIN。 學習了if(res > bndry || res == bndry && c[j] > '7') return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;res = res * 10 + (c[j] - '0');}return sign * res;} }作者:jyd 鏈接:https://leetcode-cn.com/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/solution/mian-shi-ti-67-ba-zi-fu-chuan-zhuan-huan-cheng-z-4/ 來源:力扣(LeetCode)【總結】
1.威威&&甜姨工作心得
-有現成的工具和類庫需盡量使用,因為它們是性能更優,且經過更嚴格測試,是相對可靠的;
-能抽取成工具類、工具方法的盡量抽取,以突出主干邏輯、方便以后代碼復用;
-不得不寫得比較繁瑣、冗長的時候,需要寫清楚注釋、體現邏輯層次,以便上線以后排查問題和后續維護
-等真正工作以后,盡可能地調用jdk的方法,比如Character.isDigit。如果沒有你想要的api,也要盡量使用guava,apache common等常見的utils包,盡量不要自己造輪子
2. 提前量思想(生活也得如此)
判斷越界 可以考慮打提前量
if (ans > (Integer.MAX_VALUE - digit) / 10) {// 本來應該是 ans * 10 + digit > Integer.MAX_VALUE// 但是 *10 和 + digit 都有可能越界,所有都移動到右邊去就可以了。return negative? Integer.MIN_VALUE : Integer.MAX_VALUE;}總結
以上是生活随笔為你收集整理的[剑指offer]面试题第[67]题[Leetcode][JAVA][第8题] 字符串转换整数 (atoi)[字符串]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VSDX Annotator for m
- 下一篇: [剑指offer]面试题第[53-1]题