今日份又完成3个,虽然是两个简单和1个中等,不得不说。中等有些思想能懂,但是自己上手后对于部份结构的使用不熟和代码细节真的还欠缺考虑,后面加油吧。
两个简单就不写了,思想也比较简单,重点要回顾总结一下中等难度:
394,字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
代码如下:
class Solution {
public String decodeString(String s) {
StringBuilder res = new StringBuilder();
int multi = 0;
LinkedList<Integer> stack_multi = new LinkedList<>();
LinkedList<String> stack_res = new LinkedList<>();
for(Character c:s.toCharArray()){
if(c=='['){
stack_multi.addLast(multi);
stack_res.addLast(res.toString());
multi=0;
res=new StringBuilder();
}else if(c==']'){
StringBuilder tmp=new StringBuilder();
int cur_mutil=stack_multi.removeLast();
for(int i=0;i<cur_mutil;i++){
tmp.append(res);
}
res=new StringBuilder(stack_res.removeLast()+tmp);
}else if(c>='0'&&c<='9'){
multi=multi*10+ Integer.parseInt(c+"");
}
else{
res.append(c);
}
}
return res.toString();
}
}
思想其实是很清晰的,首先挨个便利,核心思路是每次遇到 [ 时需要存储两个信息,一个是数字,另一个是数字前面的字符串,例如abc3[def],当遇到 [ 时,记录(“abc”,3)。
将例子:3[a2[c]]输入:
首先遇到3,此实mutil=0*10+3=3
遇到[,记录multi值:3放入数值栈stack_multi=[3],当前字符串res=""放入字符栈stack_res=[].刷新res内容和multi值
遇到a,放入res=a
遇到2,此时multi=0*10+2=2
遇到[,记录multi值2放入数值栈stack_multi=[3,2],当前字符串res="a"放入字符栈stack_res=["a"],刷新res和multi;
遇到c,放入res=c
遇到] ,开始弹出,取出cur_multi=2,拿2去倍数res的内容存放在tmp中,tmp=cc。再把cc和上层拼接:res内容重新为=acc;
遇到],开始弹出,取出cur_multi=3,拿3去陪数res的内容存放在tmp中,tmp=accaccacc,再和上层拼接:res=accaccacc;
结束:res=accaccacc。
思路不通畅的时候一步一步的去看去理解还是挺有必要的,但是源码中既然要用stack,为何还要定义linklist呢,虽然也没问题,但是第一次看感觉还是挺让人误会的。然后就是multi的计算为什么要*10再加整形嘞,乘10有啥子意义。。目前还没懂。
其次,要重视对字符串做操作时候使用stringBuilder类对象和stringBuffer类对象,这又能引出这两个类使用的差别: