我有这个函数,它应该对数组进行排序,然后得到最后一项的差异 - 第一项,并在中间添加所有缺失的数字,然后将它与原始数组进行比较,并计算出添加了多少数字,所以它工作正常,但在一些测试用例中它表现奇怪,在数组索引的最后一项不是正确的下面是代码和测试用例
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