2016-10-18 18 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