随着高等教育的普及,大学毕业生的数量也逐年水涨船高,就业市场上的技术类岗位也越来越不足以满足大学毕业生的数量。
这让秋招和大学生就业呈现出越来越激烈的竞争形势,想要找到好工作就需要更强的实力。而就业环境的变好是需要时间的,不是一年两年就能快速改善的。
直到现在,很多的同学们依然是秋招 0 offer 的状态,果然是考得好不如早生两年。
免费下载 - MySQL和Oracle的详细区别
CSDN - 本博客C++入门笔记快捷下载
今天带来在美团一面面试中曾经出现过的题目:
题目描述:
题号:394
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

解题思路:
思路一:辅助栈
这个算法的关键:使用栈来保存嵌套的重复序列的信息。
每当遇到一个 '[',就将当前的解码状态和重复次数保存起来,并开始一个新的解码序列。每当遇到一个 ']',就将当前解码序列的结果根据之前保存的重复次数进行重复,并与之前的解码结果合并。
算法步骤:
-
初始化:
-
首先,检查输入字符串是否为空。如果是,则直接返回空字符串。
-
初始化两个栈(在Go中使用切片模拟):一个用于存储重复次数(
subNum),另一个用于存储临时字符串(subStr)。 -
初始化一个变量
sum用于累加数字,以及一个变量res用于存储当前的解码结果。
-
-
遍历输入字符串:
-
对于每个字符,首先检查它是否是一个数字。如果是,则更新
sum变量。 -
如果字符是 '[',这表示即将开始一个新的重复序列。此时,将当前的
sum和res分别压入subNum和subStr栈,并重置sum和res。 -
如果字符是 ']',这表示当前重复序列结束。从
subStr栈中弹出上一个临时字符串temp,从subNum栈中弹出重复次数total。然后,将res重复total次并附加到temp上,最后将结果存回res。 -
如果字符是字母(或其他非数字、非括号的字符),则直接将其附加到
res。
-
-
返回结果:
-
遍历完整个输入字符串后,
res中存储的就是最终的解码结果。返回res。
-
n 是输入字符串的长度,m 是解码后字符串的长度。
时间复杂度:O(n)
空间复杂度:O(n + m)
C++
// C++
class Solution {
public:
string decodeString(string s) {
if(s.size() == 0) {
return "";
}
stack<int> sub_num;
stack<string> sub_str;
int sum = 0;
string res = "";
for(auto ch : s) {
if(ch >= '0' && ch <= '9') { //处理数字
sum = sum * 10 + (ch - '0');
} else if(ch == '[') { //[则入栈
sub_num.push(sum);
sum = 0;
sub_str.push(res);
res = "";
} else if(ch == ']') { //出栈处理
string temp = sub_str.top();
sub_str.pop();
int total = sub_num.top();
sub_num.pop();
for(int i = 0; i < total; i++) {
temp += res;
}
res = temp;
} else { //字符串处理
res += ch;
}
}
return res;
}
};
go
// go
func decodeString(s string) string {
if len(s) == 0 {
return ""
}
subNum := []int{}
subStr := []string{}
sum := 0
res := ""
for _, ch := range s {
if ch >= '0' && ch <= '9' { // 处理数字
sum = sum*10 + int(ch-'0')
} else if ch == '[' { // [ 则入栈
subNum = append(subNum, sum)
sum = 0
subStr = append(subStr, res)
res = ""
} else if ch == ']' { // 出栈处理
temp := subStr[len(subStr)-1]
subStr = subStr[:len(subStr)-1]
total := subNum[len(subNum)-1]
subNum = subNum[:len(subNum)-1]
for i := 0; i < total; i++ {
temp += res
}
res = temp
} else { // 字符串处理
res += string(ch)
}
}
return res
}
220

被折叠的 条评论
为什么被折叠?



