2015-09-06 4 views
0

Я работал над вопросом leetcode и наткнулся на этот вопрос и увидел ответ в Интернете.Наибольшее количество (javascript) пояснение

В соответствии с 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

Здесь нет замыкания? – Bergi

+0

Где вы видели этот ответ? Скопируйте его и укажите автора кода. – Bergi

+0

Вы имели в виду 'function (a, b) {return a - b; } '? – melpomene

ответ

0

Что такого рода в основном делает это для каждого элемента в массиве a и b. Проверьте, каким образом числа будут высокими, исходя из того, как они будут упорядочены. Например, если a = 30 и b = 5. Тогда:

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

Поскольку это положительное число, то это означает b будет слева от из a в конечном массиве (строки).

Обратите внимание, что в примере данных [3, 30, 34, 5, 9] элемент 9 по сравнению с любым другим элементом приведет к тому, что слева находится 9 (это самый низкий элемент в массиве). Ниже приведен фрагмент примера каждого сравнения с дополнительной информацией о консоли (, чтобы показать, как выполняется каждое сравнение и результат, обратите внимание, что 9 всегда был ниже по сравнению с каждым элементом. Затем следующее число 5 ниже, чем все, кроме 9):

var largestNumber = function(nums) { 
 
     return nums.sort(function (a,b){ 
 
      var priority = (b + '' + a) - (a + '' + b) 
 
      console.log((b + '' + a) + " - " + (a + '' + b) + " => " + (priority)); 
 
      if(priority > 0) console.log(a + " > " + b); 
 
      else console.log(a + " < " + b); 
 
      return (b + '' + a) - (a + '' + b); 
 
     }).join('').replace(/^0*/,'') || '0'; 
 
}; 
 
var nums= [3, 30, 34, 5, 9] 
 
console.log(largestNumber(nums));

0

отрезала вы представили в основном код, который создает максимально возможное «число» из элементов массива.

Давайте представим, что мы имеем следующий вход: [3, 30, 34, 5, 9]

Прежде всего, вид принимает функцию в качестве параметра. Его задачей является сортировка чисел в нисходящем лексикографическом порядке (так что 34 будет меньше 5, потому что 3 меньше 5). Он делает это, сравнивая значения строк, состоящих из «ab» и «ba», поэтому, если «ba» - «ab» является отрицательным значением, предполагается, что «a» меньше, чем «b», и скоро.

На этом этапе у вас есть: [9,5,34,3,30]

После происходит сортировка, она вызывает функцию Join() с «» в качестве параметра, который означает, что он будет соединяйте элементы в строку, разделяя каждый элемент с данным параметом, который вообще не является разделом.

На этом этапе у вас есть: «9534330»

Тогда у вас есть вызов функции замены, которая будет искать определенный шаблон и заменить его на заданный вторым параметром. Первым параметром в этом случае является регулярное выражение, которое будет соответствовать каждой строке с «0» в начале ее и содержать ноль или более случаев «0».

(Ссылка на регулярные выражения: http://www.w3schools.com/js/js_regexp.asp)

На этом этапе вы до сих пор: «9534330»

Наконец, в конце выражения возвратного есть || '0', что в основном означает, что оно вернет '0' в случае, если первая часть возвращаемого выражения ложна, либо неправильным, либо отсутствующим вводом.

Смежные вопросы