我有这个函数,它应该对数组进行排序,然后获取最后一项 - 第一项的差异,并添加其间所有缺失的数字,然后将其与原始数组进行比较并找出有多少个数字添加了,所以它工作正常,但在某些测试用例中,它的行为很奇怪,数组中索引的最后一项不是正确的,下面是代码和测试用例
function makeArrayConsecutive2(statues) {
var sorted = statues.sort();
var arr =[];
var firstItem = sorted[0];
var lastItem = sorted[sorted.length -1];
var difference= lastItem-firstItem;
var counter=0;
for (var i=0;i<=difference;i++){
arr.push(firstItem++);
}
for(var i=0;i<arr.length;i++){
if(sorted.indexOf(arr[i])==-1){
counter++;
}
}
console.log(counter);
}
makeArrayConsecutive2([1,3,5]); //this works correctly and the output
//is 2 since the numbers missing are 2 and 4 so 2 numbers
makeArrayConsecutive2([1,3,5,9,12]); //this outputs 5 when it should
//output 7
有人可以帮助我吗,因为我快疯了,无法弄清楚为什么它会这样!
最佳答案
在 JavaScript 中,内置的 Array.sort()
基于字符串而不是数字进行排序。因此,即使您有一个数字数组,您也需要将比较函数传递给 sort() 方法,以确保值按数字排序:
function makeArrayConsecutive2(statues) {
var sorted = statues.sort(function (a,b) {
return a - b;
});
var arr =[];
var firstItem = sorted[0];
var lastItem = sorted[sorted.length -1];
var difference= lastItem-firstItem;
var counter=0;
for (var i=0;i<=difference;i++){
arr.push(firstItem++);
}
for(var i=0;i<arr.length;i++){
if(sorted.indexOf(arr[i])==-1){
counter++;
}
}
console.log(counter);
}
makeArrayConsecutive2([1,3,5]); //this works correctly and the output
//is 2 since the numbers missing are 2 and 4 so 2 numbers
makeArrayConsecutive2([1,3,5,9,12]); //this outputs 5 when it should
//output 7
您的第一个示例之所以有效,是因为只有三个数字,即使将其视为字符串,它们也会按正确的顺序排序。另一方面,当按字符串排序时,您的第二个数组将变为 [1, 12, 3, 5, 9]
- 您可以自己记录下来查看。通过使用自定义比较功能,数字可以正确排序。欲了解更多信息,请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
关于javascript - 数组中最后一项的行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48087537/