【问题标题】:Using javascript to decode a string使用 javascript 解码字符串
【发布时间】:2014-04-20 04:46:09
【问题描述】:

我在hacker.org 上做一个挑战,这就是它所说的“我有一段特殊的文本代表一个特定的值。这是我计算它的方法: 从左到右开始阅读, 如果一个字符是一个数字,我把它加到我的总和中, 如果是“x”,我将其删除并左移两个位置, 继续,直到我击中字符串的末尾。 例如,字符串 '123x456' 的值为 26。

什么是 '93752xxx746x27x1754xx90x93xxxxx238x44x75xx08750912738x8461x8759383xx328x4x4935903x6x5550360535004x0xx945958961296x267x8842xxx5x6xx61x4x48482x80xxx83316843x7x4x83x9521731xxx25x51xx457x6x5x9698222x771237745034x5133592x27xx8x87xx35221x36x0x50x23x7x63x998418xx' 的值?“ P>

这是我为解决此任务而编写的代码

    function decrypt(text){
        var sum = 0; 
        for(var i = 0; i < text.length ; i++){
            if(isNaN(parseInt(text[i])) == false){
                sum += parseInt(text[i]);
            }
            else if(text[i] == "x" || "X"){
                text.replace(text[i],0);
                i = i - 2;

            }
        }
        return sum;
    }
document.write(decrypt('93752xxx746x27x1754xx90x93xxxxx238x44x75xx08750912738x8461x8759383xx328x4x4935903x6x5550360535004x0xx945958961296x267x8842xxx5x6xx61x4x48482x80xxx83316843x7x4x83x9521731xxx25x51xx457x6x5x9698222x771237745034x5133592x27xx8x87xx35221x36x0x50x23x7x63x998418xx'));

当我运行这段代码时,它似乎在运行一个无限循环,这是为什么呢?

【问题讨论】:

    标签: javascript encryption decode encode


    【解决方案1】:

    .replace() 方法不会改变原始字符串(字符串在 js 中是不可变的),它只是返回带有替换子字符串的新字符串,因此用零替换 'X' 或 'x' 应该看起来有点不同:

    text = text.replace(text[i], 0);
    

    请注意,此代码在您的函数中可以正常工作,但它不会考虑被替换子字符串的确切位置(它会找到第一次出现并替换它)。在其他情况下,您可能会考虑使用.substr() 替换特定字符,如下所示:

    // concatenating part before character, '0' and part after character
    text = text.substr(0, i) + '0' + text.substr(i + 1);
    

    还有一个上面没有提到的问题:

    else if(text[i] == "x" || "X")
    

    if 结构中有两个语句:text[i] == "x""X"。虽然第一个很好,但第二个将始终评估为 true,每次达到此语句时将 i 向后移动两个 - 遗憾的是,JS 无法猜测您是否正在尝试强制 "X" 为布尔值或想知道 text[i] 是否等于 "X",它只是将每个表达式计算为单个表达式,并且 "X" 被强制转换为 true

    【讨论】:

    • 很好地捕捉到 if 语句总是评估为真。 String.prototype.replace 方法不会替换 all 事件 - 仅替换第一个。除非您在第三个参数中传递 'g' 或使用带有 g 标志的 RegExp。所以,text = text.replace(text[i], 0) 在这种情况下应该可以工作。
    • @nderscore 是的,我的错。无法删除代码示例,因此删除了所有这些乱七八糟的内容。
    【解决方案2】:

    您可以通过在开始操作之前将其转换为数组来解决字符串不变性问题(根据Fike 的回答)。你的函数可以写成:

    function decrypt(str){
        var s = str.split('') //=> convert to Array
           ,i = -1
           ,sum = 0;
        while ((i+=1)<s.length){
            sum += +s[i] || 0;
            if (/[xX]/.test(s[i])) {
                s[i] = 0;
                i -= 3;
            }
        }
        return sum;
    }
    // decrypt('123x456') => 26
    

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 1970-01-01
      • 2012-05-27
      • 2021-10-26
      • 1970-01-01
      • 2021-08-25
      • 2013-06-15
      • 2013-08-22
      • 1970-01-01
      相关资源
      最近更新 更多