面试经典150题0516
Leetcode020 有效的括号
左括号直接添加到栈中,右括号要判断栈顶是否有匹配的左括号,有则继续,没有直接返回false
。
class Solution {
public boolean isValid(String s) {
Deque<Character> stack = new ArrayDeque<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(c == '(' || c == '{' || c == '['){
stack.addLast(c);
}
else {
if(stack.isEmpty()){
return false;
}
if(c == ')' && stack.peekLast() == '(' || c == '}' && stack.peekLast() == '{' || c == ']' && stack.peekLast() == '['){
stack.pollLast();
continue;
}
return false;
}
}
return stack.isEmpty();
}
}
Leetcode071 简化路径
import java.nio.file.Path;
public String simplifyPath(String path) {
return Path.of(path).normalize().toString();
}
以"/"
作为分割,判断是否为正确的文件名。
tmp
为有效值 :存入栈中;tmp
为..
:弹出栈顶元素(若存在);tmp
为.
:不作处理。
public static String simplifyPath(String path) {
// 栈模拟
Deque<String> stack = new ArrayDeque<>();
int n = path.length();
for (int i = 0; i < n; i++) {
if(path.charAt(i) == '/'){
continue;
}
// 找到下一个'\'前面的字串
int j = i + 1;
while (j < n && path.charAt(j) != '/'){
j++;
}
String tmp = path.substring(i, j);
if(tmp.equals("..")){
if(!stack.isEmpty()){
stack.pollLast();
}
}
else if(!tmp.equals(".")){
stack.addLast(tmp);
}
i = j;
}
StringBuilder stringBuilder = new StringBuilder();
while (!stack.isEmpty()){
stringBuilder.append("/").append(stack.pollFirst());
}
return stringBuilder.isEmpty() ? "/" : stringBuilder.toString();
}
Leetcode155 最小栈
借助一个辅助栈minStack
存储stack
中的最小值。
push()
:每当新值进来时,如果小于等于minStack
栈顶的值,则同时push()
到辅助栈minStack
,即更新了栈顶的最小值。pop()
:将栈中元素pop()
时,比较是否和minStack
的栈顶元素相同,相同则同时将minStack
栈顶元素弹出。getMin()
:返回minStack()
栈顶元素即可。
minStack
等价于遍历stack
中所有元素,把升序的数字都删除,留下一个从栈底到栈顶降序的栈。相当于给stack
中降序元素做了标记,每当pop()
这些降序元素,minStack
会将相应的栈顶元素pop()
出去,保证栈顶元素始终为当前stack
中的最小元素。
class MinStack {
private Stack<Integer> stack;
private Stack<Integer> minStack;
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int val) {
if(minStack.isEmpty() || minStack.peek() >= val){
minStack.push(val);
}
stack.push(val);
}
public void pop() {
int tmp = stack.pop();
if(!minStack.isEmpty() && tmp == minStack.peek()){
minStack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}