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