2016-10-27 27 views
0

编写一个名为“getLengthOfShortestElement”的函数。找到数组中最短元素的第一个实例

给定一个数组,“getLengthOfShortestElement”返回给定数组中最短字符串的长度。

备注: *如果数组为空,它应该返回0。

我的代码:

function getLengthOfShortestElement(arr) { 

    if (arr.length === 0) return 0; 
     return arr.sort(function(a, b){ 
      return a.length> b.length; 
     }).unshift(); 
} 

getLengthOfShortestElement(['one', 'two', 'three']); // 3 

为什么不通过测试,它应该“处理关系”通过仅返回最短元素的第一个实例。另外,有没有更好的方法使空数组返回0?

+2

你是什么意思“为什么不通过测试,它应该‘处理关系’仅返回最短元素的第一个例子“。 ?它应该返回一个长度还是一个实例?目前还不清楚 –

+0

它返回给定数组中最短字符串的长度。如果多个元素共享相同的最短长度,它将返回仅第一个元素的长度。这是反馈我从REPL得到:对失败的测试 it_should_handle_ties 更多信息 错误:预计3为2 以n – sopstem2428

+0

*“?有没有做一个空数组返回0的一种更好的方式” * - 这有什么错你目前使用的简单直接的技术?顺便说一句,你的排序函数应该'返回a.length - b.length;'(比较器不应该返回一个布尔值)。 – nnnnnn

回答

0

由于JavaScript的Array.prototype.sort文档clearly states

The sort() method sorts the elements of an array in place and returns the array. The sort is not necessarily stable.

换句话说,也不能保证具有相同长度的元素会在排序结果的顺序相同,因为他们在原来的。

也许更好的方法是绕过可能不稳定的排序并简单地自己处理数组。这可以用下面的伪代码很容易做到:

def getFirstShortestElement(array): 
    if len(array) == 0: 
     return 0 
    firstSmall = 0 
    for index = 1 to len(array) - 1, inclusive: 
     if len(array[index]) < len(array[firstSmall]): 
      firstSmall = index 
    return array[firstSmall] 

As an aside, your function is spectacularly misnamed. It does not give you the "LengthOfShortestElement" at all. Function names should reflect what they do, you'll find your code much easier to maintain if you follow that rule :-)

+0

那么我应该如何解决这个问题呢? – sopstem2428

+0

@ Tyler.Borer,用*方法*更新,您可以使用它,这取决于您将其转换为您选择的语言。 – paxdiablo

+0

谢谢。我正在按照提供的练习,这不是最差的错误名称 – sopstem2428

0

它应该适用于所有情况的作品。

function getLengthOfShortestElement(arr){ 

    if (arr.length === 0) return 0; 

    var shortestLength = arr[0].length; 
    arr.forEach(function (each) { 
     shortestLength = each.length < shortestLength ? each.length : shortestLength; 
    }); 

    return shortestLength; 
} 
+0

*“如果数组为空,它应该返回0”* – nnnnnn

+0

如果所有字符串都是10,000,000个字符以上,该怎么办? :-) – paxdiablo

1

这可以用减速机完成。

function getLengthOfShortestElement(arr) { 

    if (!arr.length) return 0; 

    return arr.reduce(function(prev, current) { 

     if (prev === null) return current.length; 
     if (current.length < prev) return current.length; 

     return prev; 
    }, null); 
} 
+0

'.reduce()'是一个很好的方法,但是你显示的代码不会返回* element *,它会返回元素的长度。 – nnnnnn

+0

@nnnnnn'如果(!arr.length)返回0;' – tom10271

+1

而不是以'null'开始,你可以简单地从'Infinity'开始并放弃第一个条件。 – Bergi

0

我不明白你的意思是“为什么不通过测试,它应该‘处理关系’通过仅返回最短元素的第一个实例”。

但空数组返回0,我会做:

function getLengthOfShortestElement(arr){ 
    if (!arr){return 0} 
    //rest of your code 
} 
0

您使用不印字,其中前添加一个元素,而不是删除它,你就错过了length属性。

function getLengthOfShortestElement(arr) { 
    if (!arr || !arr.length) {return 0;} 
    arr = [].concat(arr); // Prevent altering the source array 
    return arr.sort(function (a, b) { 
     return a.length > b.length; 
    }).shift().length; 
} 

getLengthOfShortestElement(['one', 'two', 'three']); // 3 

对于长的阵列,它可能更快,如果你旅行的阵列检查长度:

function getLengthOfShortestElement(arr) { 
    if (!arr || !arr.length) {return 0;} 
    var minlength = (""+arr[0]).length; 
    for (var i = 1; i < arr.length; i++) { 
     var len = (""+arr[i]).length; 
     if (len < minlength) {minlength = len;} 
    } 
    return minlength; 
} 
相关问题