добавление значений, которые соответствуют определенному условию javascript - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть массив строк array_strings, и я хочу получить максимальную длину x последовательных значений из списка и вернуть строку.Я пытался с этим кодом, но он не работает.

var myArr = ['we', 'make', 'the', 'best', 'dishes', 'in', 'cooking', 'class'];
x = 2;

function myFunc(array_strings, x) {
  // your code

  let val = '',
    y = 0;
  array_strings.sort((a, b) => {
    return a.length < b.length
  });
  if (array_strings.length > 0) {
    while (x) {
      val += array_strings[y];
      y++;
      x--;
    }
  }

  return val;
}
console.log(myFunc(myArr, x))
// expected output 'cookingclass'

при сортировке, я не могу выполнить последовательный заказ.Куда я иду не так?

Ответы [ 4 ]

0 голосов
/ 20 сентября 2018

Попробуйте это:

arr = ['we', 'make', 'the', 'best', 'dishes', 'in', 'cooking', 'class']
x = 2
var sorting = function (array_strings, items) {
    // your code

    let val = '', y = 0;
    const sort = array_strings.sort((a, b) => a.length < b.length);
    console.log({sort});
    
    if (arr.length > 0){
      while (items){
      val += array_strings[y];
      y++;
      items--;
     }
    }

	return val;
}

var s = sorting(arr,x);
console.log({s});
0 голосов
/ 20 сентября 2018

Не думаю, что для этого есть какая-то причина.Вы можете просто переместить скользящее окно длиной x по массиву и отслеживать самую длинную последовательность, которую вы видели:

let array_strings = ['we', 'make', 'the', 'best', 'dishes', 'in', 'cooking', 'class']


function findMax(array_strings, x){
    let max_index = 0, max_length = 0

    for (let i= 0; i < array_strings.length - x + 1; i++){
        let length = array_strings.slice(i, i+x).reduce((l, c) => l + c.length, 0)
        if (length > max_length) {
            max_index = i,
            max_length = length
        }
    }
    return array_strings.slice(max_index, max_index + x)
}
console.log(findMax(array_strings,2))
console.log(findMax(array_strings,3))
console.log(findMax(array_strings,4))
0 голосов
/ 20 сентября 2018

Решение с скользящей суммой O (n):

function findLongestConsec(arr, l) {
    var curSum = array_strings.slice(0, l).map(ele => ele.length).reduce((a, b) => a+b);
    var curMax = curSum;
    var curMaxIndex = 0;
    for (var i = 1; i < arr.length - l + 1; i++) {
        curSum = curMax - arr[i-1].length + arr[i+l-1].length;
        if (curSum > curMax) {
            curMax = curSum;
            curMaxIndex = i;
        }
    }
    return arr.slice(curMaxIndex, curMaxIndex + l).join('');
}

Все предыдущие решения включают конкатенацию строк.Я не думаю, что стоит делать это каждый раз.Нам просто нужно отследить начальный индекс самого длинного подмассива.

0 голосов
/ 20 сентября 2018

Для простоты сначала получите все возможные значения для x последовательных элементов.

function longestConsecutives(arr, x) {
    var consecutives = [];
    for (var i=0; i<arr.length-x; i++)
        consecutives.push(arr.slice(i, x).join(''));

и затем ищите среди них максимальную длину:

    var longest = consecutives[0];
    for (var i=1; i<consecutives.length; i++)
        if (consecutives[i].length > longest.length)
            longest = consecutives[i];
    return longest;
}

Существует также более эффективный подход к поиску результата, посмотрите на this для вдохновения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...