这些程序中的一个是否优于另一个程序? JavaScript的

时间:2014-01-23 15:34:49

标签: javascript

从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]));

你认为第二种选择会更好吗?

3 个答案:

答案 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。 所以你的答案非常好,但他们的问题有点不准确

但事实是你已经注意到了他们的错误,并制定了更好的算法,你可以跳过另一个教训:)。