leetCode 8 String to Integer

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

相關文章
相關標籤/搜索