给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 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}

这个就很容易理解了,每两两比较,如果当天的价格大于于第二天的价格,我们就不买也不卖。如果当天的价格小于第二天的价格,我们就当天买进,第二天卖掉,如果第三天的价格比第二天的价格还高,怎么办呢,我们还要卖(实际上这是不可能的,因为我们已经卖掉了),但我们可以这样理解。