k-й по величине элемент(строка) в массиве по длине

#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);