当试图弄清楚如何获取数组的中值时,我首先想弄清楚数组中元素的数量是奇数还是偶数。
- 如果数字是奇数,那么控制台将记录中间的元素。
- 如果有偶数个元素,我希望控制台记录“不是奇数个数字”。
我确信有更简单的方法来获取数组的中位数,但我想自己弄清楚。现在我只需要帮助,为什么控制台在我对数组的第二次测试中记录数字 1
,即使该数组中有偶数个元素?它在第一次和第三次测试中运行良好,但在第二次测试中却不行...为什么?
function median (arr) {
let sorted = arr.sort((a, b) => a-b)
let midIndex = sorted.splice(0, sorted.length / 2)
if (arr.length %2 != 0) {
return midIndex[midIndex.length-1]
} else {
return "Not an odd number of numbers"
}
}
try {
let result = median([4, 8, 2, 4, 5])
console.log(result) // -> 4
result = median([-5, 1, 5, 2, 4, 1]) // -> 1
console.log(result)
result = median([5, 1, 1, 1, 3, -2, 2, 5, 7, 4, 5, 6]) // -> Not an odd number of numbers
console.log(result)
} catch (e) {
console.error(e.message)
}
最佳答案
因为 splice
实际上改变了原始 数组的长度 - 它不会创建新数组。您可以通过记下 before 调用 splice
function median (arr) {
var initLength = arr.length;
let sorted = arr.sort((a, b) => a-b)
let midIndex = sorted.splice(0, sorted.length / 2)
console.log(initLength, arr.length);
if (arr.length %2 != 0) {
return midIndex[midIndex.length-1]
} else {
return "Not an odd number of numbers"
}
}
try {
let result = median([4, 8, 2, 4, 5])
//console.log(result) // -> 4
result = median([-5, 1, 5, 2, 4, 1]) // -> 1
//console.log(result)
result = median([5, 1, 1, 1, 3, -2, 2, 5, 7, 4, 5, 6]) // -> Not an odd number of numbers
//console.log(result)
} catch (e) {
console.error(e.message)
}
所以将 6 的数组拼接成两半得到的长度为 3,这是奇数。而是使用原始数组长度,它会按照您的预期进行:
function median (arr) {
var initLength = arr.length;
let sorted = arr.sort((a, b) => a-b)
let midIndex = sorted.splice(0, sorted.length / 2)
if (initLength %2 != 0) {
return midIndex[midIndex.length-1]
} else {
return "Not an odd number of numbers"
}
}
try {
let result = median([4, 8, 2, 4, 5])
console.log(result) // -> 4
result = median([-5, 1, 5, 2, 4, 1]) // -> 1
console.log(result)
result = median([5, 1, 1, 1, 3, -2, 2, 5, 7, 4, 5, 6]) // -> Not an odd number of numbers
console.log(result)
} catch (e) {
console.error(e.message)
}
关于javascript - 数组中元素的奇数个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64007572/