我正在研究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));
答案 0 :(得分:0)
这种基本上做的是对于数组a
和b
中的每个元素。根据订购方式,检查数字的高低方向。例如,如果a = 30
和b = 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',输入错误或缺失。