从CodeAcademy学习了一些Javascript后,我想尝试一些练习来测试我的知识。 演习就是这个 编写一个JavaScript函数,它将存储一组数字,并分别找到第二个最低和第二个最大数字。 - 请参阅:http://www.w3resource.com/javascript-exercises/javascript-functions-exercises.php#EDITOR
我的功能是这个
function checker(array) {
narray = array.sort();
console.log(narray);
console.log(narray[1] + "," + narray[array.length - 2]);
}
checker([1, 2, 3, 4, 5]);
他们的功能是这个
function Second_Greatest_Lowest(arr_num)
{
arr_num.sort(function(x,y)
{
return x-y;
});
var uniqa = [arr_num[0]];
var result = [];
for(var j=1; j<arr_num.length; j++)
{
if(arr_num[j-1] !== arr_num[j])
{
uniqa.push(arr_num[j]);
}
}
result.push(uniqa[1],uniqa[uniqa.length-2]);
return result.join(',');
}
alert(Second_Greatest_Lowest([1,2,3,4,5]));
你认为第二种选择会更好吗?
答案 0 :(得分:3)
如上所述,他们的答案需要第二个唯一编号,而且效率也相当低。
您的解决方案与他们的解决方案有两点不同:
隐式排序功能是一种自然排序。这意味着对象将转换为字符串并作为字符串进行比较:
[1, 2, 3, 11].sort() // [1, 11, 2, 3]
[1, 2, 3, 11].sort(function(a,b){ return a-b }); // [1, 2, 3, 11]
第二个区别,数字的唯一性。你的解决方案给出数组中第二个位置的数字,而他们给出的数字具有第二个最低值:
[1,1,2] // Your solution: 1,1
[1,1,2] // Their solution: 2,1
虽然你可以说这不是必需的,但这是一个定义问题。
无论哪种方式,他们的解决方案都可以进行改进,以提高效率,但不是那么可读:
function getNumbers(arr) {
if (!arr.length) throw new Error('arr has no items');
arr = arr.slice().sort(function(a,b){ return a-b }); // copy and sort the array
for (var i=0; arr[i] === arr[0]; i++);
if (i === arr.length) { // all numbers are identical
return [arr[0], arr[0]];
}
var a = arr[i]; // second lowest number
i = arr.length-1;
var b = arr[i];
while (arr[i] === b) i--;
return [a, arr[i]];
}
// usage
getNumbers([2,3,1,1,1,6,4,5,6,1,11]) //[2, 6]
如您所见,一旦找到您感兴趣的数字,就不再遍历已排序的数组。与计算唯一数字数组的解决方案相比,这个解决方案效率更高,特别是对于大型数组。
答案 1 :(得分:2)
没有。你的功能更好。真。 原因是w3resource.com想要告诉你它应该如何工作 - 这是教程。你只是实用的程序员。
当您将字符串放入内部或负数时,两种解决方案都会起作用..
答案 2 :(得分:1)
练习的文字被误解了。他们应该从开头到结尾要求第二个“唯一”号码。然后:
1,1,1,1,1, 2 ,3,4, 5 ,6,6,6,6,6
真正的答案是:2,5。来自你的脚本的答案是1和6。 所以你的答案非常好,但他们的问题有点不准确。
但事实是你已经注意到了他们的错误,并制定了更好的算法,你可以跳过另一个教训:)。