8. 字符串转换整数 (atoi)(中等)
【分类】:模拟、正则表达式
【题解】:
解法1:直接模拟,但是在判断INT_MAX和INT_MIN上需要注意,因为直接判断会超出范围,所以可以将式子转换一下,本来是num * 10 + str[i] - '0' > MAX,可以转换为(MAX - (stri[i] - '0')) / 10 < num。
解法2:不得不说正则表达式真的牛逼啊啊啊啊!!!
'^[\+\-]?\d+', s.lstrip()
让我们来分析一下这个关键部分!
^x:表示匹配以字符串x为开头的字符串
[\+\-]?:匹配+或-或者什么也没有(?表示将前面的字符匹配0或1次)
\d:表示数字
+:表示前面的字符一次或无数次
s.lstrip(a):将字符串前面连续的a字符去除,默认为‘ ’
肯定有人要问最前面的*是什么意思了!!这个是解包,可以将findall返回的列表组成一个字符串。
【代码】:
C++(解法1):
1 class Solution { 2 public: 3 int myAtoi(string str) { 4 int i = 0, f = 0; 5 for (i = 0; i < str.size() && str[i] == ' '; i++); 6 if (str[i] == '-')f = -1, i++; 7 else if (str[i] == '+') f = 1, i++; 8 else if(isdigit(str[i]))f = 1; 9 if (f == 0)return 0; 10 int num = 0, f2 = 0; 11 int MAX = 2147483647, MIN = -2147483648; 12 for (; i < str.size() && isdigit(str[i]); i++) 13 { 14 if (num > ((MAX - (str[i] - '0')) / 10 )) 15 { 16 if (f == 1)return MAX; 17 else return MIN; 18 } 19 num = num * 10 + (str[i] - '0'); 20 } 21 if (f == 1)return num; 22 else return -num; 23 } 24 };
Python3(解法2):
1 class Solution: 2 def myAtoi(self, s: str) -> int: 3 return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)
11. 盛最多水的容器(中等)
【分类】:双指针
【题解】:将指针l、r分别位于两端,比较两端元素大小,假如说左端大,那么易得以右端为端点已经取到了最大值(因为元素间距离不能再大了),我们接下来可以看看以左端为端点还能不能更大,所以要把右指针往左移,此时如果右端大,那么以左端为端点已经取得了最大值,依次类推。
【代码】:
C++:
1 class Solution { 2 public: 3 int maxArea(vector<int>& height) { 4 int ans = 0, l = 0, r = height.size() - 1; 5 while(l <= r) 6 { 7 ans = max(ans, min(height[l], height[r]) * (r - l)); 8 if (height[l] > height[r])r--; 9 else l++; 10 } 11 return ans; 12 } 13 };
Python3:
1 class Solution: 2 def maxArea(self, height: List[int]) -> int: 3 ans = 0 4 l = 0 5 r = len(height) - 1 6 while l <= r: 7 ans = max(ans, min(height[l], height[r]) * (r - l)) 8 if (height[l] > height[r]): r -= 1 9 else: l += 1 10 return ans
Python3(解法2):