给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
上期的问题是:138, 买卖股票的最佳时机 II
1public int maxProfit(int[] prices) {
2 int profit = 0, i = 0;
3 while (i < prices.length) {
4 while (i < prices.length - 1 && prices[i + 1] <= prices[i]) i++;
5 int min = prices[i++];
6 while (i < prices.length - 1 && prices[i + 1] >= prices[i]) i++;
7 profit += i < prices.length ? prices[i++] - min : 0;
8 }
9 return profit;
10}
解析:
min记录的是当天的价格并且第二天的价格又比他高,然后这样才能当天买进,至于第二天要不要卖掉还要看第三天的价格,如果第三天比第二天低,那么第二天必须卖掉,如果第三天比第二天高,那么第二天就不能卖掉,然后第三天是否卖掉还要由第四天的价格决定……这里面的i++比较多,最好能画张图列几条数据看的更明白一些,否则有可能会有点晕。上面的代码可能有点多,下面来看一种更简洁的一种写法。
1public int maxProfit(int[] prices) {
2 int total = 0;
3 for (int i = 0; i < prices.length - 1; i++)
4 total += Math.max(prices[i + 1] - prices[i], 0);
5 return total;
6}
这个就很容易理解了,每两两比较,如果当天的价格大于于第二天的价格,我们就不买也不卖。如果当天的价格小于第二天的价格,我们就当天买进,第二天卖掉,如果第三天的价格比第二天的价格还高,怎么办呢,我们还要卖(实际上这是不可能的,因为我们已经卖掉了),但我们可以这样理解。