js 算法之索引处的解码字符串

给定一个编码字符串 S。请你找出 解码字符串 并将其写入磁带。解码时,从编码字符串中 每次读取一个字符 ,并采取以下步骤:如果所读的字符是字母,则将该字母写在磁带上。
如果所读的字符是数字(例如 d),则整个当前磁带总共会被重复写 d-1 次。现在,对于给定的编码字符串 S 和索引 K,查找并返回解码字符串中的第 K 个字母。

这是力扣的一道题,我读了十分钟题目,大概明白了,本来感觉非常简单,我直接for循环暴力破解拉倒! 超时了。
非常郁闷,不得已,用了回调函数。

 function se(str,k,m=0){
     let num =0
     for(let i =0;i<str.length;i++){
        if(Number(str[i]).toString()=="NaN"){
            if(num+str[i].length>=k){
               return str[i][k-num-1]
            }else{
                num = num+str[i].length
            }
        }else{
            console.log(num,k)
            if(num*(str[i])>k){
                k = k%num
                if(k==0){
                    return se(str,num-k)
                }else{
                    return se(str,k)
                }
            }
            if(num*(str[i])==k){
                return se(str,num)
            }
            num = num*(str[i]) 
        }
    }
 }
var decodeAtIndex = function(s, k) {
    let n = s.split("")
    let str = []
    let stm = ""
    for(let i =0;i<n.length;i++){
        if(Number(n[i]).toString()=="NaN"){
            stm+=n[i]
        }else{
            str.push(stm)
            str.push(Number(n[i]))
            stm =""
        }
        if(i==n.length-1&&Number(n[i]).toString()=="NaN"){
            str.push(stm)
        }
    }
    str = str.filter(val=> val!="")
    return se(str,k)
};

思路大概是先分类,把连续的字符串串在一起,判断是数字就把长度*数字去和他要的长度匹配,结果如果大于要的长度就取他超过几倍,然后减去那些倍数,传到函数中重新循环。写的时候墨迹了半天规律,最后找到规律一发入魂。 效率和时间都不高,希望各位大佬能给一些更好的思路,我在这抛砖引玉,谢谢各位。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自信小老头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值