从代码中删除警报会强制它进入无限循环
Removing alert from code forces it to enter infinite loop
我有一段代码包含一些 window 警报消息。它工作正常。但是,如果我删除警报语句,程序将进入无限循环。这对我来说很奇怪。
谁能帮我找出代码中的问题?
function countSwaps(arr) {
let notVisited = {}, swaps = 0;
for (let i = 0; i < arr.length; i++) {
notVisited[i] = true;
}
while (Object.keys(notVisited).length) {
alert("main pass");
let nextPos, currentPos = Object.keys(notVisited)[0];
while (arr[currentPos] !== parseInt(currentPos+1)) {
nextPos = arr[currentPos] - 1;
[arr[currentPos], arr[nextPos]] = [arr[nextPos], arr[currentPos]];
swaps+= 1;
alert("Swap " + arr[currentPos] + " and " + arr[nextPos] + "\n");
delete notVisited[nextPos];
}
delete notVisited[currentPos];
}
return swaps;
}
console.log(countSwaps([2,3,4,1,5]));
这是无限循环的原因。
while (Object.keys(notVisited).length)
应该是
while (Object.keys(notVisited).length > 0)
那是一个属性,它总是return真
好吧,它在没有警报的情况下也为我运行了一个无限循环。
问题似乎出在以下表达式上:parseInt(currentPos+1)
加法发生在从字符串到数字的转换之前,例如:
currentPos = '4';
currentPos + 1 == '41';
parseInt(currentPos + 1) == 41
你想要的大概是parseInt(currentPos) + 1
。现在:
currentPos = '4';
parseInt(currentPos) + 1 == 5
有了这个循环似乎退出了,我得到了 3 次交换的结果。
我有一段代码包含一些 window 警报消息。它工作正常。但是,如果我删除警报语句,程序将进入无限循环。这对我来说很奇怪。
谁能帮我找出代码中的问题?
function countSwaps(arr) {
let notVisited = {}, swaps = 0;
for (let i = 0; i < arr.length; i++) {
notVisited[i] = true;
}
while (Object.keys(notVisited).length) {
alert("main pass");
let nextPos, currentPos = Object.keys(notVisited)[0];
while (arr[currentPos] !== parseInt(currentPos+1)) {
nextPos = arr[currentPos] - 1;
[arr[currentPos], arr[nextPos]] = [arr[nextPos], arr[currentPos]];
swaps+= 1;
alert("Swap " + arr[currentPos] + " and " + arr[nextPos] + "\n");
delete notVisited[nextPos];
}
delete notVisited[currentPos];
}
return swaps;
}
console.log(countSwaps([2,3,4,1,5]));
这是无限循环的原因。
while (Object.keys(notVisited).length)
应该是
while (Object.keys(notVisited).length > 0)
那是一个属性,它总是return真
好吧,它在没有警报的情况下也为我运行了一个无限循环。
问题似乎出在以下表达式上:parseInt(currentPos+1)
加法发生在从字符串到数字的转换之前,例如:
currentPos = '4';
currentPos + 1 == '41';
parseInt(currentPos + 1) == 41
你想要的大概是parseInt(currentPos) + 1
。现在:
currentPos = '4';
parseInt(currentPos) + 1 == 5
有了这个循环似乎退出了,我得到了 3 次交换的结果。