[LeetCode] 008. String to Integer (Easy) (C++/Java/Python)
2015-03-01 10:07
375 查看
索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql)
Github: https://github.com/illuz/leetcode
代码(github):https://github.com/illuz/leetcode
如:2147483648 大于 INT_MAX(2147483647) ,就返回 2147483647 。
之前可以用 sscanf 偷懒,最近更新了 case 就被卡了。
要注意几点:
跳过前面的空格,\t,\n
范围界定
使用 Python 的正则表达式可以很容易处理。
Java:
Python:
使用 Python 的正则表达式:
Github: https://github.com/illuz/leetcode
008.String_to_Integer (Easy)
链接:
题目:https://oj.leetcode.com/problems/string-to-integer-atoi/代码(github):https://github.com/illuz/leetcode
题意:
将一个字符串转化为 int 型。分析:
注意如果超出范围就返回最接近的 int 数。如:2147483648 大于 INT_MAX(2147483647) ,就返回 2147483647 。
之前可以用 sscanf 偷懒,最近更新了 case 就被卡了。
要注意几点:
跳过前面的空格,\t,\n
范围界定
使用 Python 的正则表达式可以很容易处理。
代码:
C++:class Solution { public: int atoi(string str) { int ret = 0; bool overflow = false; int sign = 1; // default is '+' int i = 0; int len = str.length(); while (i < len && (str[i] == ' ' || str[i] == '\n' || str[i] == '\t')) ++i; if (i == len) return 0; // get sign if (str[i] == '-') { ++i; sign = -1; } else if (str[i] == '+') ++i; while (i < len) { if (!isdigit(str[i])) break; if ((sign == 1 && ret > (INT_MAX - (str[i]-'0')) / 10) || (sign == -1 && -ret < (INT_MIN + (str[i]-'0')) / 10)) { overflow = true; break; } ret = ret * 10 + (str[i] - '0'); ++i; } if (overflow) ret = (sign == 1) ? INT_MAX : INT_MIN; else ret *= sign; return ret; } };
Java:
public class Solution { public int atoi(String str) { int ret = 0; boolean overflow = false; int sign = 1; // default is '+' int i = 0; int len = str.length(); while (i < len && (str.charAt(i) == ' ' || str.charAt(i) == '\n' || str.charAt(i) == '\t')) ++i; if (i == len) return 0; // get sign if (str.charAt(i) == '-') { ++i; sign = -1; } else if (str.charAt(i) == '+') ++i; while (i < len) { if (str.charAt(i) < '0' || str.charAt(i) > '9') break; if ((sign == 1 && ret > (Integer.MAX_VALUE - (str.charAt(i)-'0')) / 10) || (sign == -1 && -ret < (Integer.MIN_VALUE + (str.charAt(i)-'0')) / 10)) { overflow = true; break; } ret = ret * 10 + (str.charAt(i) - '0'); ++i; } if (overflow) ret = (sign == 1) ? Integer.MAX_VALUE: Integer.MIN_VALUE; else ret *= sign; return ret; } }
Python:
class Solution: # @return an integer def atoi(self, str): str = str.strip() if not str: return 0 MAX_INT = 2147483647 MIN_INT = -2147483648 ret = 0 overflow = False pos = 0 sign = 1 if str[pos] == '-': pos += 1 sign = -1 elif str[pos] == '+': pos += 1 for i in range(pos, len(str)): if not str[i].isdigit(): break ret = ret * 10 + int(str[i]) if not MIN_INT <= sign * ret <= MAX_INT: overflow = True break if overflow: return MAX_INT if sign == 1 else MIN_INT else: return sign * ret
使用 Python 的正则表达式:
class Solution: # @return an integer def atoi(self, str): str = str.strip() str = re.match(r'^[+-]?\d+', str).group() MAX_INT = 2147483647 MIN_INT = -2147483648 try: ret = int(str) if ret > MAX_INT: return MAX_INT elif ret < MIN_INT: return MIN_INT else: return ret except: return 0
相关文章推荐
- [LeetCode] 020. Valid Parentheses (Easy) (C++/Java/Python)
- [LeetCode] 014. Longest Common Prefix (Easy) (C++/Java/Python)
- [LeetCode] 006. ZigZag Conversion (Easy) (C++/Java/Python)
- [LeetCode] 013. Roman to Integer (Easy) (C++/Java/Python)
- [LeetCode] 007. Reverse Integer (Easy) (C++/Java/Python)
- [LeetCode] 009. Palindrome Number (Easy) (C++/Java/Python)
- LeetCode 63 — Unique Paths II(C++ Java Python)
- LeetCode 21 — Merge Two Sorted Lists(C++ Java Python)
- LeetCode题解汇总(C++ Java Python,含题目翻译)
- LeetCode 15 — 3Sum(C++ Java Python)
- LeetCode 69 — Sqrt(x)(C++ Java Python)
- LeetCode 142 — Linked List Cycle II(C++ Java Python)
- LeetCode 2 — Add Two Numbers(C++ Java Python)
- LeetCode 136 — Single Number(C++ Java Python)
- LeetCode 149 — Max Points on a Line(C++ Java Python)
- LeetCode 70 — Climbing Stairs(C++ Java Python)
- LeetCode 141 — Linked List Cycle(C++ Java Python)
- LeetCode 26 — Remove Duplicates from Sorted Array(C++ Java Python)
- LeetCode 19 — Remove Nth Node From End of List(C++ Java Python)
- LeetCode 62 — Unique Paths(C++ Java Python)