我正在hacker.org上做一个挑战,这就是它所说的"我有一段代表特定价值的特殊文本。以下是我如何计算它: 从左到右开始阅读, 如果一个字符是一个数字,我把它加到我的总和, 如果它是' x,我将其删除并离开两个地方, 继续,直到我到达字符串的末尾。 例如,字符串! 123x456'的值为26。
什么是的值' 93752xxx746x27x1754xx90x93xxxxx238x44x75xx08750912738x8461x8759383xx328x4x4935903x6x5550360535004x0xx945958961296x267x8842xxx5x6xx61x4x48482x80xxx83316843x7x4x83x9521731xxx25x51xx457x6x5x9698222x771237745034x5133592x27xx8x87xx35221x36x0x50x23x7x63x998418xx'"
这是我为解决此任务而编写的代码
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'));
当我运行此代码时,它似乎运行一个无限循环,为什么会这样?
答案 0 :(得分:1)
.replace()
方法不会改变原始字符串(字符串在js中是不可变的),它只返回带有替换子字符串的新字符串,因此替换&#39; X&#39;或者&#39; x&#39;零应该看起来有点不同:
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"
。虽然第一个完全正常,但第二个将始终评估为真,每次达到此声明时将i
向后移动两个 - 遗憾的是,JS无法猜测您是否& #39;试图强迫&#34; X&#34;要布尔或想要知道text[i]
是否等于&#34; X&#34;,它只是将每个表达式评估为单个表达式,并且&#34; X&#34;被转换为true
。
答案 1 :(得分:0)
您可以在开始对其进行操作之前将其转换为数组,从而解决字符串不变性问题(根据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