一个人的朝圣 — LeetCode打卡第11天
知识总结
今天继续昨天的练习, 但是感觉题目没有那么难. 方法昨天也总结了.
Leetcode 20. 有效的括号
题目说明
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
代码说明
运用栈的知识, 题目比较经典
class Solution {
public boolean isValid(String s) {
int n = s.length();
if(n % 2 == 1) return false;
Stack<Character> stack = new Stack<>();
Map<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put('}', '{');
map.put(']', '[');
for(int i =0; i < n; i++){
char c = s.charAt(i);
if(map.containsKey(c)){
if(stack.isEmpty() || map.get(c) != stack.peek()){
return false;
}else{
stack.pop();
}
}else{
stack.push(c);
}
}
return stack.isEmpty();
}
}
Leetcode 1047. 删除字符串中的所有相邻重复项
题目说明
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
代码说明
方法一 运用数组, 最后使用 String.valueOf(array, start, end) 的方法来返回. 用一个pre指针记录上一个指向的. 如果不相同则递增, 反之则递减
class Solution {
public String removeDuplicates(String s) {
char[] array = s.toCharArray();
int pre = -1;
for(int i = 0; i < s.length(); i++){
if(pre == -1 || array[pre] != array[i]){
pre++;
array[pre] = array[i];
}else{
pre--;
}
}
return String.valueOf(array, 0, pre+1);
}
}
方法二 用栈来解决问题
class Solution {
public String removeDuplicates(String s) {
Stack<Character> stack = new Stack<>();
for(int i = 0; i< s.length(); i++){
char c = s.charAt(i);
if(stack.isEmpty() || stack.peek() != c){
stack.push(c);
}else{
stack.pop();
}
}
StringBuilder sb = new StringBuilder();
while(!stack.isEmpty()){
sb.append(stack.pop());
}
return sb.reverse().toString();
}
}
Leetcode 150. 逆波兰表达式求值
题目说明
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
输入:tokens = [“2”,“1”,“+”,“3”,“*”]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
代码说明
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
Integer i = 0;
Integer j = 0;
for(String str : tokens){
if(str.equals("+")){
i = stack.pop();
j = stack.pop();
stack.push(i + j);
}else if(str.equals("-")){
i = stack.pop();
j = stack.pop();
stack.push(j - i);
}else if(str.equals("/")){
i = stack.pop();
j = stack.pop();
stack.push(j / i);
}else if(str.equals("*")){
i = stack.pop();
j = stack.pop();
stack.push(i * j);
}else{
stack.push(Integer.valueOf(str));
}
}
return (int) stack.pop();
}
}