/** * 8. åç¬¦ä¸²è½¬æ¢æ´æ° (atoi) *
* è¯·ä½ æ¥å®ç°ä¸ä¸ª myAtoi(string s) 彿°ï¼ä½¿å ¶è½å°åç¬¦ä¸²è½¬æ¢æä¸ä¸ª 32 ä½æç¬¦å·æ´æ°ï¼ç±»ä¼¼ C/C++ ä¸ç atoi 彿°ï¼ã *
* 彿° myAtoi(string s) çç®æ³å¦ä¸ï¼ *
* è¯»å ¥åç¬¦ä¸²å¹¶ä¸¢å¼æ ç¨çåå¯¼ç©ºæ ¼ * æ£æ¥ä¸ä¸ä¸ªå符ï¼åè®¾è¿æªå°å符æ«å°¾ï¼ä¸ºæ£è¿æ¯è´å·ï¼è¯»å该å符ï¼å¦ææï¼ã ç¡®å®æç»ç»ææ¯è´æ°è¿æ¯æ£æ°ã 妿䏤è é½ä¸åå¨ï¼ååå®ç»æä¸ºæ£ã * è¯»å ¥ä¸ä¸ä¸ªå符ï¼ç´å°å°è¾¾ä¸ä¸ä¸ªéæ°åå符æå°è¾¾è¾å ¥çç»å°¾ãå符串çå ¶ä½é¨åå°è¢«å¿½ç¥ã * å°å颿¥éª¤è¯»å ¥çè¿äºæ°å转æ¢ä¸ºæ´æ°ï¼å³ï¼"123" -> 123ï¼ "0032" -> 32ï¼ãå¦ææ²¡æè¯»å ¥æ°åï¼åæ´æ°ä¸º 0 ãå¿ è¦æ¶æ´æ¹ç¬¦å·ï¼ä»æ¥éª¤ 2 å¼å§ï¼ã * å¦ææ´æ°æ°è¶ è¿ 32 ä½æç¬¦å·æ´æ°èå´ [â231, 231 â 1] ï¼éè¦æªæè¿ä¸ªæ´æ°ï¼ä½¿å ¶ä¿æå¨è¿ä¸ªèå´å ãå ·ä½æ¥è¯´ï¼å°äº â231 çæ´æ°åºè¯¥è¢«åºå®ä¸º â231 ï¼å¤§äº 231 â 1 çæ´æ°åºè¯¥è¢«åºå®ä¸º 231 â 1 ã * è¿åæ´æ°ä½ä¸ºæç»ç»æã *
* 注æï¼ *
* æ¬é¢ä¸ç空ç½å符åªå æ¬ç©ºæ ¼å符 ' ' ã * é¤åå¯¼ç©ºæ ¼ææ°ååçå ¶ä½å符串å¤ï¼è¯·å¿å¿½ç¥ ä»»ä½å ¶ä»å符ã *
*
*
* ç¤ºä¾ 1ï¼ *
* è¾å ¥ï¼s = "42" * è¾åºï¼42 * è§£éï¼å ç²çå符串为已ç»è¯»å ¥çåç¬¦ï¼æå ¥ç¬¦å·æ¯å½å读åçå符ã * 第 1 æ¥ï¼"42"ï¼å½å没æè¯»å ¥å符ï¼å 为没æåå¯¼ç©ºæ ¼ï¼ * ^ * 第 2 æ¥ï¼"42"ï¼å½å没æè¯»å ¥å符ï¼å 为è¿éä¸åå¨ '-' æè '+'ï¼ * ^ * 第 3 æ¥ï¼"42"ï¼è¯»å ¥ "42"ï¼ * ^ * è§£æå¾å°æ´æ° 42 ã * ç±äº "42" å¨èå´ [-231, 231 - 1] å ï¼æç»ç»æä¸º 42 ã *
* ç¤ºä¾ 2ï¼ *
* è¾å ¥ï¼s = " -42" * è¾åºï¼-42 * è§£éï¼ * 第 1 æ¥ï¼" -42"ï¼è¯»å ¥åå¯¼ç©ºæ ¼ï¼ä½å¿½è§æï¼ * ^ * 第 2 æ¥ï¼" -42"ï¼è¯»å ¥ '-' åç¬¦ï¼æä»¥ç»æåºè¯¥æ¯è´æ°ï¼ * ^ * 第 3 æ¥ï¼" -42"ï¼è¯»å ¥ "42"ï¼ * ^ * è§£æå¾å°æ´æ° -42 ã * ç±äº "-42" å¨èå´ [-231, 231 - 1] å ï¼æç»ç»æä¸º -42 ã *
* ç¤ºä¾ 3ï¼ *
* è¾å ¥ï¼s = "4193 with words" * è¾åºï¼4193 * è§£éï¼ * 第 1 æ¥ï¼"4193 with words"ï¼å½å没æè¯»å ¥å符ï¼å 为没æåå¯¼ç©ºæ ¼ï¼ * ^ * 第 2 æ¥ï¼"4193 with words"ï¼å½å没æè¯»å ¥å符ï¼å 为è¿éä¸åå¨ '-' æè '+'ï¼ * ^ * 第 3 æ¥ï¼"4193 with words"ï¼è¯»å ¥ "4193"ï¼ç±äºä¸ä¸ä¸ªåç¬¦ä¸æ¯ä¸ä¸ªæ°åï¼æä»¥è¯»å ¥åæ¢ï¼ * ^ * è§£æå¾å°æ´æ° 4193 ã * ç±äº "4193" å¨èå´ [-231, 231 - 1] å ï¼æç»ç»æä¸º 4193 ã *
*
*
* æç¤ºï¼ *
* 0 <= s.length <= 200 * s ç±è±æåæ¯ï¼å¤§ååå°åï¼ãæ°åï¼0-9ï¼ã' 'ã'+'ã'-' å '.' ç»æ *
* æ¥æºï¼åæ£ï¼LeetCodeï¼ * 龿¥ï¼https://leetcode.cn/problems/string-to-integer-atoi * è使å½é¢æ£ç½ç»ææãåä¸è½¬è½½è¯·èç³»å®æ¹ææï¼éåä¸è½¬è½½è¯·æ³¨æåºå¤ã * * @author abomb4 2022-09-27 */ public class Solution8 { public static void main(String[] args) { Solution8 s = new Solution8(); class Case { String in; int expected; public Case(String in, int expected) { this.in = in; this.expected = expected; } } final Case[] cases = new Case[]{ new Case(" -1234321_2321", -1234321), new Case("-6147483648", -2147483648), new Case("2147483648", 2147483647), }; for (Case c : cases) { int result = s.myAtoi(c.in); System.out.printf("(%s) in: %s, real: %d, expected: %d%n", result == c.expected, c.in, result, c.expected); } } public int myAtoi(String s) { // 0: find spaces or '-' or number // 1: find numbers int resolve = 0; boolean first = true; boolean negative = false; int sum = 0; int length = s.length(); for (int i = 0; i < length; i++) { char c = s.charAt(i); if (resolve == 0) { if (c == ' ') { continue; } else if (c == '-') { negative = true; resolve = 1; } else if (c == '+') { resolve = 1; } else if (Character.isDigit(c)) { resolve = 1; first = false; sum = toNum(c); } else { return 0; } } else if (Character.isDigit(c)) { int num = toNum(c); if (first) { if (num == 0) { continue; } sum = negative ? -num : num; first = false; } else { final int newSum; if (negative) { newSum = sum * 10 - num; if (newSum > 0 || (newSum + num) / 10 != sum) { // overflow return Integer.MIN_VALUE; } } else { newSum = sum * 10 + num; if (newSum < 0 || (newSum - num) / 10 != sum) { return Integer.MAX_VALUE; } } sum = newSum; } } else { // not num break; } } return sum; } private static int toNum(char c) { return c - '0'; } }