假设我在Javascript中有一个整数数组,我想检查它的所有值是否按升序排列。我想要的是将数组键保存在另一个数组中,以防算法找到一个较低(或相等)的值,不仅要比较前一个值,还要比较它之前的任何值。 我做的是这个:
arr = [], nonvalid = [];
for (var j = 1; j < arr.length; j++){
if ( arr[j+1] <= arr[j] ){
nonvalid.push(j);
}
}
显然,上面的algorightm只会检查比之前的值更低的值。
数组可能包含以下值:
arr = 1,2,3,10, 5 ,11,12, 2 , 4 ,25
无效值是粗体值。如果我运行上面的循环,它将不会“捕获”第二个循环( 4 ),因为它高于其最近的左兄弟,但不高于它的所有左兄弟。
修改
尝试了以下解决方案,除了我之外,没有返回此数组的所有无效值。 :(
他们正确地返回了最后两个值,但不是第二个。 我不明白为什么。
[24398, 24397 ,25004,25177,26302,28036,29312,29635,29829,30476,32595,33732,34995,36047,36363,37310,38022,38882,40746,41212 ,42846,43588,44029,44595,44846,45727,46041,4729,48002,48930,49858,51184,51560,53895,54247,54614,55713,56813,57282,57480,57875,58073,58403,60321,61469 ,62051,62310,62634,63217,64505,65413,65677,65940,66203,66572,67957,68796,68964,69098,69233,69435,69759,71496,72577,72823,73007,73252,73743,73866,76405 ,77037,77416,77669,79691,80885,81339,81794,82067,82431,83244,84861,86836,88632,89877,90296,91049,91885,92351,92614,93141,93733,93930,94531,95206,95882 ,96895,97732,97973,99261,99422,99583,100332,100599,101666,102066,102600,103504,104432,105174,107216,109085,110181,110679,111777,111988,112553,113005,113457, 600 , 600 ]
答案 0 :(得分:9)
跟踪您看到的最大值(see the fiddle):
function find_invalid_numbers(arr) {
var nonvalid, i, max;
nonvalid = [];
if (arr.length !== 0) {
max = arr[0];
for (i = 1; i < arr.length; ++i) {
if (arr[i] < max) {
nonvalid.push(arr[i]);
} else {
max = arr[i];
}
}
}
return nonvalid;
}
答案 1 :(得分:3)
为什么不compare with the last known good number?
var arr = [1, 2, 3, 10, 5, 11, 12, 2, 4, 25],
nonvalid = [],
lastGoodValue = 0;
for (var j = 1; j < arr.length; j++) {
if (j && arr[j] <= lastGoodValue) {
//if not the first number and is less than the last good value
nonvalid.push(arr[j]);
} else {
//if first number or a good value
lastGoodValue = arr[j];
}
}
console.log(arr, nonvalid)
答案 2 :(得分:2)
当您发现一个元素乱序时,请查看下一个元素,直到它们相对于之前的元素不再是乱序的。
将无序元素添加到第二个数组,并从new in order元素继续。
var outs= [], L= A.length, i= 0, prev;
while(i<L){
prev= A[i];
while(A[++i]<prev) outs.push(i);
}
alert(outs)
答案 3 :(得分:1)
的 DEMO 强>
var arr = [24398, 24397, 25004, 25177, 26302, 28036, 29312, 29635, 29829, 30476, 32595, 33732, 34995, 36047, 36363, 37310, 38022, 38882, 40746, 41212, 42846, 43588, 44029, 44595, 44846, 45727, 46041, 47293, 48002, 48930, 49858, 51184, 51560, 53895, 54247, 54614, 55713, 56813, 57282, 57480, 57875, 58073, 58403, 60321, 61469, 62051, 62310, 62634, 63217, 64505, 65413, 65677, 65940, 66203, 66572, 67957, 68796, 68964, 69098, 69233, 69435, 69759, 71496, 72577, 72823, 73007, 73252, 73743, 73866, 76405, 77037, 77416, 77669, 79691, 80885, 81339, 81794, 82067, 82431, 83244, 84861, 86836, 88632, 89877, 90296, 91049, 91885, 92351, 92614, 93141, 93733, 93930, 94531, 95206, 95882, 96895, 97732, 97973, 99261, 99422, 99583, 100332, 100599, 101666, 102066, 102600, 103504, 104432, 105174, 107216, 109085, 110181, 110679, 111177, 111988, 112553, 113005, 113457, 600, 600],
nonvalid = [],
max = arr[0];
for(var j=0; j<arr.length; j++){
var test= arr[j+1]<=max ? nonvalid.push(arr[j+1]) : max=arr[j];
}
alert(nonvalid); // 24397, 600, 600
答案 4 :(得分:1)
一种简单的函数方式,可以在没有循环或变量的情况下进行内联:
arr.filter(function(a,b,c){
return Math.max.apply(Math, c.slice(0,b)) > a ;
});
答案 5 :(得分:1)
这样做的另一个非常好的功能方式可能是;
var isAscending = a => a.slice(1)
.map((e,i) => e > a[i])
.every(x => x);
console.log(isAscending([1,2,3,4]));
console.log(isAscending([1,2,5,4]));
&#13;
答案 6 :(得分:0)
首先复制数组,删除array.splice(index, 1)
内不符合顺序的任何元素,然后继续。这样,任何元素必须大于它之前的元素,但它之前的元素必须始终是最大元素。
答案 7 :(得分:0)
在接受你的建议后回答我自己的问题我尝试了下面的算法。它似乎做了它的工作,但它有点矫枉过正。
for(var i = 0; i&lt; arr.length; i ++){
for (var j = 1; j < arr.length; j++){ if ( arr[j] > 0 && arr[i] > 0 && j != i ){ if ( arr[j] <= arr[i] && j > i ){ if ( jQuery.inArray(j, nonvalid) == - 1) nonvalid.push(j); } } } }
答案 8 :(得分:0)
您可以在此示例中使用 map
:
const ascendingArray = [1,2,3,4,5,6,7];
const descendingArray = [1,2,3,7,5,6,4]
const isAscending = array => array.map((a, i) => a > array[i + 1]).indexOf(true) === -1
console.log(isAscending(descendingArray)); // should be false
console.log(isAscending(ascendingArray)); // should be true
或者,您可以在此示例中使用 filter
:
const ascendingArray = [1,2,3,4,5,6,7];
const descendingArray = [1,2,3,7,5,6,4]
const isAscending = array => array.filter((a, i) => a > array[i + 1]).length === 0;
console.log(isAscending(ascendingArray)); // should be true
console.log(isAscending(descendingArray)); // should be false