使用任何内置函数或新数组过滤JavaScript中的数组

Aar*_*ron 0 javascript arrays

我有一分钟和一分钟.迭代数组我需要删除min和max之间的所有元素.我不能使用任何内置的数组函数,如splice,数组需要保持原始顺序.例如,数组[1,5,13,​​27,58] min = 10 max = 30将返回[1,5,58]的数组.我正在寻找更多关于如何在N时间复杂度中做到这一点的策略.这个问题是面试准备.

这是我试过的代码,

function filter_range(array, min, max) {
  for (var i = 0; i < array.length; i++) {
    if (min < array[i] && array[i] < max) {
      for (var j = i; j < array.length - 1; j++) {
        var temp = array[j]
        array[j] = array[j + 1];
        array[j + 1] = temp;
      }
    }
  }
}

var array = [1, 5, 23, 13, 59];
filter_range(array, 10, 30);
for (var i = 0; i < array.length; i++) {
  console.log(array[i])
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*uck 5

您可以通过仅使用下一个适合该范围的值覆盖数组中的第N个元素来实现此目的,其中N是到目前为止发现的值的数量.然后将length数组设置为您找到的值的数量.

function filter_range(array, min, max) {
  var nextIndex = 0;
  for (var i = 0, len = array.length; i < len; i++) {
    var value = array[i];
    if (value >= min && value <= max) {
      array[nextIndex++] = value;
    }
  }
  array.length = nextIndex;
}

function test(arr, min, max) {
  console.log('Input: ' + arr.join(', '));
  console.log('Range: [' + min + ', ' + max + ']');
  filter_range(arr, min, max);
  console.log('Output: ' + arr.join(', '));
  console.log('');
}

test([1, 2, 3], 1, 2);
test([1, 2, 3], 2, 3);
test([1, 2, 3, 4, 5], 2, 4);
test([1, 2, 3], 0, 100);
test([1, 5, 13, 27, 58], 10, 30);
test([1, 13, 5, 58, 27], 10, 30);
Run Code Online (Sandbox Code Playgroud)