[js学习]一、js算法题:简单的字符串扩展

xiaoxiao2021-02-28  27

题目:

给定一个字符串,返回该字符串的扩展。输入将由有效括号中的小写字母和数字(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函数的文档描述

转载请注明原文地址: https://www.6miu.com/read-2596107.html

最新回复(0)