所以我正在尝试编码练习,但似乎找不到问题。我需要从数组中提取中位数。如果数组是偶数长度,则需要两个值的平均值。
const N = parseInt(readline());
var inputs = readline().split(' ');
for (let i = 0; i < N; i++) {
const X = parseInt(inputs[i]);
}
var arr = inputs.sort((a, b) => a - b);
if (arr.length % 2 === 0)
{
console.error(arr);
console.error(arr[arr.length / 2 - 1]);
console.error(arr[arr.length / 2]);
var a = arr[arr.length / 2 - 1];
var b = arr[arr.length / 2];
var ans = (a + b) / 2;
console.log(ans);
}
else console.log(arr[Math.floor(arr.length/2)]);
控制台输出: ['1','2','3','4','5','6','7','8','9','10'] 5 6 28
因此,从控制台输出中,我的数组已正确排序。接下来,我正确地提取了两个中位数。我的 a 确实是5,而我的 b 确实是6。但是将它们加上(a + b)/ 2突然变成28 ...为什么?
答案 0 :(得分:3)
变量var ans = (parseInt(a, 10) + parseInt(b, 10)) / 2;
和a
被当作字符串并连接在一起,然后进行除法:b
+ '5'
变成'6'
并将它们除以{ {1}}产生56
。因此,在进行加法之前,您需要将它们强制为数字:
2
在变量之前加上算术运算符,以将它们强制转换为数字,然后可以将其添加。
答案 1 :(得分:2)
花花公子您要添加两个字符串,即'5'+'6',这使其等于56除以2 = 28(是的,JS很疯狂)。只需使用parseInt,
sudo tns create Tekmo --template tns-template-hello-world
答案 2 :(得分:0)
似乎您正在将字符串加在一起。它实际上是采用charCode而不是Number值,例如:'1'.charCodeAt(0)
我通过在输入数组上使用.map解决了这个问题:
const N = parseInt(readline());
var inputs = readline().split(' ').map(function(num) { return parseInt(num); });
var arr = inputs.sort((a, b) => a - b);
if (arr.length % 2 === 0)
{
console.error(arr);
console.error(arr[arr.length / 2 - 1]);
console.error(arr[arr.length / 2]);
var a = arr[arr.length / 2 - 1];
var b = arr[arr.length / 2];
var ans = (a + b) / 2;
console.log(ans);
}
else console.log(arr[Math.floor(arr.length/2)]);