LeetCode-探索-初级算法-字符串-6. 字符串转换整数(atoi)(个人做题记录,不是习题讲解)
LeetCode探索-初级算法:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/
- 字符串转换整数(atoi)
-
语言:java
-
思路:先判断是否数字,在不越界情况下计算,越界直接返回临界值;判断符号,如果反复出现符号or出现其他符号,则直接输出当前值。
-
代码(2ms):
class Solution { public int myAtoi(String str) { char[] arr = str.trim().toCharArray(); int res = 0; int digit = -1; boolean negative = false; boolean positive = false; for(int i = 0; i < arr.length; ++i){ if('0'<=arr[i]&&arr[i]<='9'){ digit = arr[i] - '0'; if((!negative)&&(res > Integer.MAX_VALUE/10||(res == Integer.MAX_VALUE/10&&digit>7))) return Integer.MAX_VALUE; if(negative&&(res > Integer.MAX_VALUE/10||(res == Integer.MAX_VALUE/10&&digit>8))) return Integer.MIN_VALUE; res = res * 10 + digit; }else{ if(arr[i]=='-'&&!positive&&!negative&&digit==-1){ negative = true; continue; }else if(arr[i]=='+'&&!negative&&!positive&&digit==-1){ positive = true; continue; }else{ break; } } } if(negative) res = -res; return res; } }
-
参考代码(1ms):判断方式比我优雅,整体思路没有太大区别。这里比较巧妙判断溢出的方式是上一次结果和这一次/10是否相等。
class Solution { public int myAtoi(String str) { char[] nums = str.toCharArray(); if(nums.length == 0) return 0; int offset = 0; while(nums[offset] == ' ') { offset++; if(offset >= nums.length) return 0; } if(nums[offset] != '+' && nums[offset] != '-' && nums[offset] < '0' && nums[offset]>'9') { return 0; } int flag = nums[offset] == '-'? -1 : 1; if(nums[offset] == '-' || nums[offset] == '+') offset++; int ans = 0; for(int i = offset;i < nums.length && nums[i] >= '0' && nums[i] <= '9'; i++) { int pre = ans; ans = ans * 10 + (nums[i] - '0') * flag; if(ans / 10 != pre) { return flag >= 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE; } } return ans; } }
-
参考后重写(2ms):主要还是我运算写得不够简洁,优化问题,先不管
class Solution { public int myAtoi(String str) { char[] arr = str.toCharArray(); int length = arr.length; if(length==0) return 0; int index = 0; while(arr[index]==' '){ ++index; if(index >= length) return 0; } int flag = 1; if(arr[index]=='-'){ flag = -1; ++index; } else if(arr[index]=='+') ++index; int tmp; int res = 0; while(index<length){ if('0'<=arr[index]&&arr[index]<='9'){ tmp = res; res = res * 10 + (arr[index]-'0') * flag; if(tmp!=res/10){ return flag > 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE; } ++index; }else{ break; } } return res; } }