我有一分钟和一分钟.迭代数组我需要删除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)
您可以通过仅使用下一个适合该范围的值覆盖数组中的第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)