Day205:这里有个约定规则,实现一个方法 decodeStr,输入一个字符串,根据约定规则输出编码结果。约定规则如下:
Genzhen opened this issue · comments
Genzhen commented
//str = "2[a]1[bc]", 返回 "aabc".
// str = "2[e2[d]]", 返回 "eddedd".
// str = "3[abc]2[cd]ff", 返回 "abcabcabccdcdff".
// 可以看出: N[string],表示string 正好重复 N 次。假设字符串一定是有效正确的字符串;但是你需要考虑其他可能出现的入参错误场景。
每日一题会在下午四点在交流群集中讨论,五点小程序中更新答案
欢迎大家在下方发表自己的优质见解
二维码加载失败可点击 小程序二维码
扫描下方二维码,收藏关注,及时获取答案以及详细解析,同时可解锁800+道前端面试题。
参考代码实现
- 实现方式一
var decodeStr = function (str) {
if (typeof str !== "string") {
throw "请输入字符串";
}
var index = 0,
decodeQueue = [];
while (index < str.length) {
var eleStr = str[index];
if (eleStr === "[") {
decodeQueue.push(index);
}
if (decodeQueue.length > 0 && eleStr === "]") {
var leftIndex = decodeQueue.pop();
var rightIndex = index;
str = strFormat(str, leftIndex, rightIndex);
index = 0;
continue;
}
index++;
}
return str;
};
var strFormat = function (str, startIndex, rightIndex) {
// 辅助函数: 将形如str[]对应左右index展开;
var temp = str.substring(startIndex + 1, rightIndex);
var copiedStr = "";
var copyNum = "";
while (str[--startIndex] >= 0) {
copyNum = str[startIndex] + copyNum;
}
for (var i = 0; i < copyNum; i++) {
copiedStr += temp;
}
str =
str.substring(0, startIndex + 1) +
copiedStr +
str.substring(rightIndex + 1);
return str;
};
- 实现方式二
function decodeStr(str) {
if (typeof str !== "string") {
throw "请输入字符串";
}
while (str.indexOf("[") > 0) {
str = str.replace(/(\d+)\[(\w+)\]/g, (match, num, str) => str.repeat(num));
}
return str;
}
叶家伟 commented
function generateStr(str) {
const reg = /(\d+)\[(\w+)\]/g;
let res = str;
while(reg.test(res)){
res = res.replace(reg, (...params) => {
return params[2].repeat(Number(params[1]));
})
}
return res;
};
generateStr("2[a]1[bc]");