添加满足特定条件的值javascript

时间:2018-09-20 19:01:37

标签: javascript ecmascript-6

我有一个字符串数组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 :(得分:0)

为简单起见,首先获取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以获得启发。

答案 1 :(得分:0)

我认为没有理由对此进行排序。您可以在数组上移动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))

答案 2 :(得分:0)

滚动总和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('');
}

以前的解决方案都涉及字符串连接。我不认为每次都值得这样做。我们只需要跟踪最长子数组的起始索引即可。

答案 3 :(得分:0)

尝试一下:

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