单选多选+两道编程(核心代码模式){一道编程+一道sql}
编程题
394.字符串解码
class Solution {
public String decodeString(String s) {
int k = 0;
StringBuilder res = new StringBuilder();
Stack<Integer> kstack = new Stack<>();
Stack<StringBuilder> restack = new Stack<>();
for(char c : s.toCharArray()){
if(c == '['){
//碰到括号,记录K和当前res,归零。
kstack.push(k);
restack.push(res);
k = 0;
res = new StringBuilder();
}else if(c ==']'){
//出最近的一个左括号入的k,当前res进行计算不入栈
int curk = kstack.pop();
StringBuilder temp = new StringBuilder();
for(int i = 0; i < curk; i++){
temp.append(res);
}
//与括号外合并
res = restack.pop().append(temp);
}else if(c >= '0' && c <= '9'){
k = c - '0' + k * 10;
//如果k是多位数需要x10
}else{
res.append(c);
//如果是字母则缓慢添加
}
}
return res.toString();
}
}
public String decodeString(String s) {
// 思路: 乘法和 递推公式 前一个和作为下一个加法的加数
// 3[a]2[bc] = 3a+2bc = (3a + "") + 2bc
// 3[a2[c]] = 3(2c + a) = 3(2c + a) + ""
// 1. 初始化倍数和res 及其对应栈
int multi = 0;
StringBuilder res = new StringBuilder();
Deque<Integer> multi_stack = new LinkedList<>();
Deque<String> res_stack = new LinkedList<>();
// 2. 遍历字符
char[] chars = s.toCharArray();
for (char ch : chars) {
// 3. 统计倍数
if (ch >= '0' && ch <= '9')
multi = multi * 10 + (ch - '0');
// 4. 统计res
else if (ch >= 'a' && ch <= 'z')
res.append(ch);
// 5. 入栈并重置临时变量
else if (ch == '[') {
multi_stack.push(multi);
res_stack.push(res.toString());
// 重置开始下一轮重新统计
multi = 0;
res = new StringBuilder();
// 6. 出栈做字符串乘法和加法
} else {
int cur_multi = multi_stack.pop();
StringBuilder temp = new StringBuilder();
// 乘以当前统计字符串res
for (int i = 0; i < cur_multi; i++)
temp.append(res);
// 加上前一个统计字符串作为当前res
res = new StringBuilder(res_stack.pop() + temp);
}
}
return res.toString();
}