这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战
345. 反转字符串中的元音字母
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例 1:
输入:"hello"
输出:"holle"
示例 2:
输入:"leetcode"
输出:"leotcede"
提示:
- 元音字母不包含字母 "y" 。
方法一
双指针:
设置两个指针,分别置于字符串的头和尾
- 当头指针不是元音字母时,往后移,直到指向的是元音字母;
- 当尾指针不是元音字母时,往前移,直到指向的是元音字母;
- 交换头尾指针指向的两个元音字母
重复上述步骤,直到头指针在尾指针的后面;
class Solution {
public String reverseVowels(String s) {
String set = "aeiouAEIOU";
char[] ch = s.toCharArray();
int n = ch.length;
for (int i = 0, j = n - 1; i < j; i ++, j --) {
while (i < n && set.indexOf(ch[i]) < 0) i ++;
while (j > i && set.indexOf(ch[j]) < 0) j --;
if (i >= j) break;
char tmp = ch[i];
ch[i] = ch[j];
ch[j] = tmp;
}
return new String(ch);
}
}
时间复杂度: O(n)
空间复杂度: O(n)
739. 每日温度
请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
示例 2:
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
示例 3:
输入: temperatures = [30,60,90]
输出: [1,1,0]
提示:
1 <= temperatures.length <= 105
30 <= temperatures[i] <= 100
方法一
单调栈:
根据题意,转换一下,就是让我们求在当前元素的右边,第一个比其大的元素的位置和他之间的距离;
求右边第一个比自己大的元素,这句话,一下子就能让我们想到可以使用单调栈来求解;
从右往左遍历,维护一个栈;
- 当前元素比栈顶元素小时,计算和栈顶元素之间的距离;
- 当前元素比栈顶元素大时,将栈顶元素出栈,直到栈顶元素比自己大或者栈为空;若还有元素,则计算距离;否则,为0;
class Solution {
public int[] dailyTemperatures(int[] temp) {
LinkedList<Integer> stk = new LinkedList<>();
int n = temp.length;
int[] res = new int[n];
for (int i = n - 1; i >= 0; i -- ) {
if (stk.size() == 0) {
stk.add(i);
res[i] = 0;
}
else {
while(stk.size() > 0 && temp[stk.getLast()] <= temp[i]) stk.removeLast();
if (stk.size() == 0) res[i] = 0;
else res[i] = stk.getLast() - i;
stk.add(i);
}
}
return res;
}
}
时间复杂度: O(n)
空间复杂度: O(n)