#javascript #algorithm
#язык JavaScript #алгоритм
Вопрос:
Мне нужно найти k-й по величине элемент в массиве(строк) и вернуть их в соответствии с рангом.
Пример —
Ввод
var array = ['java','python','javascript','C','Swift','Dart'];
Ожидаемый Результат
[['javascript', 1], ['python', 2], ['Swift', 3], ['java', 4], ['Dart', 4], ['C', 5]]
Я попробовал это —
var rank = 0 var result = [] var arr = ['java','python','javascript','C','Swift','Dart']; arr.sort((a,b)=gt;b.length-a.length); for(let i=0;ilt;arr.length;i ){ if(arr[i 1]===undefined){ break; } else if (arr[i].lengthgt;arr[i 1].length){ rank} result.push([arr[i],rank]) } console.log(JSON.stringify(result))
Но, как вы можете видеть, это не сработает. Как мне подойти к этому? Немного помощи, пожалуйста.
Ответ №1:
const arr = ['java','python','javascript','C','Swift','Dart']; arr.sort((a, b) =gt; b.length - a.length) const res = arr.reduce((acc, el) =gt; {acc.push([el, acc.length == 0 ? 1 : el.length == acc[acc.length-1][0].length ? acc[acc.length-1][1] : acc[acc.length-1][1] 1]); return acc}, []) console.log(JSON.stringify(res))
Если вы хотите сделать это по-своему, вы можете сделать что-то вроде следующего:
let rank = 1 const arr = ['java','python','javascript','C','Swift','Dart']; arr.sort((a,b)=gt;b.length-a.length); const result = [[arr[0], 1]] for(let i=1;ilt;arr.length;i ){ if (arr[i].lengthlt;arr[i-1].length){ rank} result.push([arr[i],rank]) } console.log(JSON.stringify(result))
Комментарии:
1. Ваше второе решение («мой путь») не работает. Это вывод к этому —
[["javascript",1],["python",1],["Swift",1],["java",1],["Dart",1],["C",1]]
Хотя я искал решение «по-своему» с обычными циклами for без сокращения и т. Д2. это старая версия, которую вы тестируете. Впоследствии я внес правку. Пожалуйста, проверьте еще раз. @Раджаршигошал
3. о, ух ты! мило! работает! но я не понимаю, ваш последний код выглядит так же, как и ваша предыдущая версия. Не будете ли вы так любезны объяснить?
4. Это такая строка:
if (arr[i].lengthlt;arr[i-1].length){
. В предыдущей версии так и былоif (arr[i].lengthgt;arr[i-1].length){
.5. А, ладно! моя вина! Большое вам спасибо!
Ответ №2:
Вы могли бы использовать тот факт, что свойства объекта повторяются в порядке изменения значения индекса:
const array = ['java','python','javascript','C','Swift','Dart']; const buckets = Object.fromEntries(array.map(a =gt; [a.length, []])); for (let word of array) buckets[word.length].push(word); const result = Object.values(buckets) .reverse() .map((bucket, rank) =gt; bucket.map(word =gt; [rank 1, word])) .flat(); console.log(result);