最大数量(javascript)解释

时间:2015-09-06 18:28:34

标签: javascript

我正在研究leetcode问题并遇到这个问题并在网上看到了答案。

根据MDN,我们应该对内部函数进行排序(函数(a,b)返回a + b)以正确排序数组。

有人可以解释闭包的工作原理并进一步解释以下代码吗? (我不太了解比较的顺序)

/*Given a list of non negative integers, arrange them such that they form the largest number.

For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

Note: The result may be very large, so you need to return a string instead of an integer.*/
var largestNumber = function(nums) {
        return nums.sort(function (a,b){
            return (b + '' + a) - (a + '' + b);
        }).join('').replace(/^0*/,'') || '0';
};
var nums= [3, 30, 34, 5, 9]
console.log(largestNumber(nums));

2 个答案:

答案 0 :(得分:0)

这种基本上做的是对于数组ab中的每个元素。根据订购方式,检查数字的高低方向。例如,如果a = 30b = 5。然后:

(b + '' + a) - (a + '' + b) 
530 - 305
225

由于这是一个正数,这意味着b将在最终数组( string )中位于a的左侧。

请注意,在示例数据[3, 30, 34, 5, 9]中,元素9与任何其他元素进行比较会导致9位于左侧(意味着它是数组中的最低项) 。下面是一些片段示例,其中包含一些额外的控制台信息(以显示每个比较的完成方式和结果,注意9与每个元素相比总是较低。然后是下一个数字{ {1}}低于除5 )以外的所有内容:

9

答案 1 :(得分:0)

您提供的剪辑基本上是一个代码,可以从数组元素中构建最大可能的“数字”。

假设我们有以下输入:[3,30,34,5,9]

首先,排序是将函数作为参数。它的工作是以递减的字典顺序对nums进行排序(因此34将小于5,因为3小于5)。它通过比较由“ab”和“ba”组成的字符串的值来做到这一点,所以如果“ba” - “ab”是负值,它将假设'a'小于'b',并且等等。

在此步骤中您有:[9,5,34,3,30]

在进行排序之后,它使用''作为参数调用join()函数,这意味着它将元素连接成一个字符串,用给定的参数分隔每个元素,这根本就没有分离。

在此步骤中您有:“9534330”

然后,您调用replace函数,该函数将查找某个模式并将其替换为给定的第二个参数。在这种情况下,第一个参数是一个正则表达式,它将匹配每个字符串的开头为“0”,并且包含零个或多个出现的“0”。

(参考正则表达式:http://www.w3schools.com/js/js_regexp.asp

在此步骤中,您仍然可以:“9534330”

最后,在返回表达式的末尾有一个|| '0',这基本上意味着如果返回表达式的第一部分为false,则返回'0',输入错误或缺失。