【LeetCode】2020-04 每日一题

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 };
View Code

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)
View Code

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 };
View Code

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
View Code

Python3(解法2):

猜你喜欢

转载自www.cnblogs.com/z1014601153/p/12731777.html