题目:
给定一个字符串,返回该字符串的扩展。输入将由有效括号中的小写字母和数字(1到9)组成。最后一个右括号后面没有字母或数字。
例如:
solve("3(ab)") = "ababab" -- "ab" repeats 3 times
solve("2(a3(b))" = "abbbabbb" -- "a3(b)" == "abbb" repeats twice.
本人的解决方案:
function solve(str){ //.. var i=0 for(var j=0;j<str.length;j++) { if(str[j]=="(") { i+=1; } } for(var z=0;z<i;z++) { var first=str.lastIndexOf("("); var last=str.indexOf(")"); var str1=str.substring(first+1,last); var str3=str.substring(first-1,last+1); var nonum=str.substring(first,last+1); var reg=/[0-9]*/ var reg1= /[^0-9]/ var str2=str1 console.log(str[first-1]) if(reg1.test(str[first-1])){ var str5=str.replace(nonum,str1) str=str5 } if(reg.test(str[first-1])) { for(var x=0;x<Number(str[first-1])-1;x++) { str2=str2.concat(str1); } str4=str.replace(str3,str2) str=str4; } } return str
}
思路:先通过一个for循环去获取字符串中有几个“(”来决定第二个for循环要循环多少次来变更字符串;接下来用lastIndex( )和index( )获取“(”最后出现的索引值和“)”索引值,由此可以获取最里层括号里的字符串,再由if语句判断字符串需不需要重复,判断关键在于first-1位置是否为数字。如果是数字的话,重复多少次由数字决定,然后用replace()将之前括号内容及括号数字覆盖;如果是字母的话,将括号内容以及括号覆盖。
更佳的解决方案:
const solve = (str) => [...str.replace(/\(|\)/g, '')].reduceRight((a, b) => { if (/\d/.test(b)) return a.repeat(b - 1) + a; return b + a; }, '');思路:用replace去除字符串中的括号字符,再通过reduceRight( )将字符串遍历之后,如果遍历为数字则,则将b之后的字符串重复,如果不是,则直接相加成一个字符串。
要点:reduceRight()的理解
点击打开链接这是reduceRight函数的文档描述