leetcode.windliang.cc/ 第一時間發佈java
將一個字符串轉爲整型。spa
這道題,難度其實不大,和上道題有不少重合的地方。總體的思路就是遍歷字符串,而後依次取出一個字符就能夠了。無非是考慮一些特殊狀況,還有就是理解題目意思。code
通過屢次試錯,題目的意思是這樣的。cdn
從左遍歷字符串,能夠遇到空格,直到遇到 ' + ' 或者數字或者 ' - ' 就表示要轉換的數字開始,若是以後遇到除了數字的其餘字符(包括空格)就結束遍歷,輸出結果,無論後邊有沒有數字了,例如 " - 32332ada2323" 就輸出 "- 32332"。blog
若是遇到空格或者 ' + ' 或者數字或者 ' - ' 以前遇到了其餘字符,就直接輸出 0 ,例如 " we1332"。leetcode
若是轉換的數字超出了 int ,就返回 intMax 或者 intMin。字符串
public int myAtoi(String str) {
int sign = 1;
int ans = 0, pop = 0;
boolean hasSign = false; //表明是否開始轉換數字
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '-' && !hasSign) {
sign = -1;
hasSign = true;
continue;
}
if (str.charAt(i) == '+' && !hasSign) {
sign = 1;
hasSign = true;
continue;
}
if (str.charAt(i) == ' ' && !hasSign) {
continue;
}
if (str.charAt(i) >= '0' && str.charAt(i) <= '9') {
hasSign = true;
pop = str.charAt(i) - '0';
//和上道題判斷出界一個意思只不過記得乘上 sign 。
if (ans * sign > Integer.MAX_VALUE / 10 || (ans * sign == Integer.MAX_VALUE / 10 && pop * sign > 7))
return 2147483647;
if (ans * sign < Integer.MIN_VALUE / 10 || (ans * sign == Integer.MIN_VALUE / 10 && pop * sign < -8))
return -2147483648;
ans = ans * 10 + pop;
} else {
return ans * sign;
}
}
return ans * sign;
}
複製代碼
時間複雜度:O(n),n 是字符串的長度。get
空間複雜度:O(1)。string
這道題讓本身有點感到莫名其妙,好像沒有 get 到出題人的點???it