9

Javascript に整数の配列があり、そのすべての値が昇順であるかどうかを確認したいとします。私が望むのは、アルゴリズムが直前の値を比較するだけでなく、その前の値を比較するよりも低い(または等しい)値を見つけた場合に備えて、配列キーを別の配列に保存することです。私がしたことはこれでした:

arr = [], nonvalid = [];

for (var j = 1; j < arr.length; j++){
    if ( arr[j+1] <= arr[j] ){
        nonvalid.push(j);
    }
}

明らかに、上記のアルゴリズムは、前の値と比較して低い値のみをチェックします。

配列には、次のような値が含まれる場合があります。

arr = 1、2、3、10、5、11、12、2、4、25 _ _ _ _

無効な値は太字です。上記のループを実行すると、最後から 2 番目のもの ( 4 )は「キャッチ」されません。これは、最も近い左の兄弟よりも高いが、すべての左の兄弟よりも高くないためです。

編集:

次の解決策を試しましたが、 mine を除いて、この配列のすべての無効な値を返すものはありません。:(

最後の 2 つの値は正しく返されましたが、2 番目の値は返されませんでした。理由はわかりませんが。

[ 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、6145、655169、655169、655169、655169、655169、655169、655169、655169、655169、655169、655169 、65940、66203、66572、67957、68796、68964、69098、69233、69435、69759、71496、72577、72823、73007、73252、73743、73866、737666、76666、76666、76666、76666、76666、766666666666、7666666666、76664 、82067、82431、83244、84861、86836、88632、89877、90296、91049、91885、92351、92614、93141、93733、93930、94531、95206、952、952、952、952655、 100599、101666、102066、102600、103504、104432、105174、107216、109085、110181、110679、111177、111988、112553、7、113005、113005600 ]

4

9 に答える 9

4

順不同の要素を見つけたら、順不同の前の要素と比べて順不同でなくなるまで、次の要素を調べます。

順不同の要素を 2 番目の配列に追加し、新しい順になっている要素から続行します。

var outs= [], L= A.length, i= 0, prev;
while(i<L){
    prev= A[i]; 
    while(A[++i]<prev) outs.push(i);
}
alert(outs)
于 2013-04-29T20:06:17.063 に答える
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
于 2013-04-29T19:50:10.547 に答える