2016-10-18 19 views
0

我有一个最小值和最大值。遍历数组我需要删除min和max之间的所有元素。我不能使用任何内置的数组函数,如拼接,数组需要保持原始顺序。例如数组[1,5,13,​​27,58] min = 10 max = 30会返回一个[1,5,58]的数组。我正在寻找更多关于如何在N时间复杂度下做到这一点的策略。这个问题是面试准备。使用任何内建函数或新数组在JavaScript中过滤数组

这里是我试过的代码,

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]) 
} 
+0

@kevinternet,我只是说我试过的代码。我没有得到它的工作 – Aaron

+0

该数组总是要排序? –

+0

@MikeC数组并不总是要排序 – Aaron

回答

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

-2

我能想到的是良好的价值观移动到一个新的数组

function run(){ 
    var a = [1,5,13,27,58]; 
    var b = []; 
    var min = 10; 
    var max = 30; 

    alert (a); 

    for (i=0;i<a.length;i++){ 
    if (a[i]>max || a[i]<min) { 
     b.push(a[i]); 
    } 
    } 

    alert (b); 
} 
+2

标题说你不能使用新的数组。 – Barmar