标签:index string 约定 substring let str 规则 var
这里约定一个规则,实现一个方法 decodeStr,输入一个字符串,根据约定规则输出编码结果。约定规则如下:
str = "2[a]1[bc]", 返回 "aabc".
str = "2[e2[d]]", 返回 "eddedd".
str = "3[abc]2[cd]ff", 返回 "abcabcabccdcdff".
可以看出: N[string],表示string 正好重复 N 次。假设字符串一定是有效正确的字符串;但是你需要考虑其他可能出现的入参错误场景。
方法一、
decodeStr("2[a]1[bc]");
function decodeStr(str){
if(typeof str !== 'string'){
throw TypeError('invalid arguments not a string');
}
//做一个while循环直到没有[]为止
while(str.includes('[')){
str = replaceStr(str)
}
console.log(str);
return str;
}
//找到字符串中的第一个N[string]并替换成相应值
function replaceStr(str){
//从左向右找到第一个 ] 位置
let rIndex = str.indexOf(']');
//找到和上面]匹配的[ 位置
let lIndex = str.lastIndexOf('[',rIndex);
//[] 前面的数值开始位置
let numIndex = 0;
//找到数值开始位置,从-1开始是为了如果str第0个位置是N,那么需要将数值置为0
for(let i = lIndex - 1; i >= -1; i--){
if(isNaN(str[i])){
//+1的原因是因为i 为NaN,那么数值开始位置就应该是下一个位置 i+1
numIndex = i+1;
break;
}
}
//找到[]前面的数值
let num = str.substring(numIndex,lIndex);
//根据数值转换后的字符串
let replaceStr = str.substring(lIndex+1,rIndex).repeat(num);
//替换原来位置并返回替换后的新字符串
str = str.replace(str.substring(numIndex,rIndex+1),replaceStr)
return str;
}
方法二、
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;
};
标签:index,string,约定,substring,let,str,规则,var 来源: https://blog.csdn.net/MFWSCQ/article/details/112275888
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。