encodeString codefights:程序未通过所有测试。“在测试-31上超出30/31输出限制”。请支持

时间:2018-08-04 06:21:48

标签: javascript decode string-decoding

function decodeString(s)
{
    let arr = [];
    let digitSum = '';
    let digitSumArr = []; // for numbers before '['
    let i; 

    //iterating string
    for (i = 0; i < s.length; i++)
    {
        if (!isNaN(s[i]))
        {
            digitSum += s[i]; // count number before '['
        }
        else if (s[i] === '[')
        {
            // add number to the array
            digitSumArr.push(+digitSum); 
            arr.push(i + 1);
            digitSum = '';
        }
        else if (s[i] === ']')
        {

            let digit = digitSumArr.pop();
            i = decStr(arr, i, digit);

            digitSum = '';
        }
        else
        {
            digitSum = '';
        }

    }

    return s;

    function decStr(arr, j, number)
    {
        let arrLen = arr.length;
        let n = number;
        let str = s.slice(arr[arrLen - 1], j);
        let sumStr = str;
        while (n-- > 1)
        {
            sumStr = sumStr.concat(str);
        }

        str = number + '[' + str + ']';

        s = s.replace(str, sumStr);

        arr.splice(arrLen - 1, 1);

        //return position for iterating

      return j + sumStr.length - str.length - 1; 
      }
}

给出一个编码字符串,返回其对应的解码字符串。 编码规则是:k [encoded_string],其中方括号内的encode_string精确重复k次。 注意:k保证是正整数。

请注意,您的解决方案应具有线性复杂度,因为这是在面试中会问到的问题。

1 个答案:

答案 0 :(得分:0)

问题在于,在给定解决方案的情况下,失败的测试具有足够的复杂度输入,需要比分配的限制花费更多的时间来解决。因此,您需要找到一个更有效的解决方案。

我在您的解决方案和另一个使用递归过程调用的解决方案上运行了性能基准测试,您的速度慢了33%。建议您重构解决方案,以在遇到嵌套迭代时递归调用解析过程。