7

の配列が[1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7]あり、3つの連続した番号(昇順または降順)の各ケースを検索したい場合、どのようにすればよいですか?

次に、これらの各シーケンスのインデックスを使用して配列にアラートを送信します。

例:前の配列はを返し[0,4,6,7]ます。

これまでのところ私はこれを持っています...これは大まかなスタートです

var arr = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var results = [];

for (var i = 1; i < arr.length; i++) {
    if ((arr[i] - arr[i-1] != 1) && (arr[i] - arr[i+1] != 1)) {
        results.push(arr[i]);
    }

}
alert(results);

助けてくれてありがとう!

math.absポインタをありがとう。これは私がやったことです:

var array = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var indexes = [];

for(var i=0; i < array.length; i++) {
    var diff = array[i+1] - array[i];
    if(Math.abs(diff)==1 && array[i+1]+diff == array[i+2]) {
        indexes.push(i);
    }
}
alert(indexes);
4

5 に答える 5

4

このタスクのコンテキストも知っておくと面白いでしょう...とにかく、これが私の解決策です:

var arr     = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var results = [];
var limit   = arr.length - 1; 

var sequence = 0;
for (var i = 0; i < limit; ++i) {
  var diff = arr[i+1] - arr[i];
  if (sequence && sequence === diff) {
    results.push(i-1);
    continue;
  }
  sequence = (diff === 1 || diff === -1) // or ... Math.abs(diff) === 1
           ? diff
           : 0;
}
console.log(results);

考え方は単純です。2つのネイバーを2回比較する必要はありません。)この比較がシーケンスを開始する場合は一種のシーケンスフラグを上げ、シーケンスがない場合は下げるだけで十分です。

于 2012-05-24T20:36:57.567 に答える
3

これはあなたの質問に対する非常に文字通りのアプローチです-私は順方向の数字だけをチェックしましたが、逆方向の追加はほとんど同じ方法で行われます

var arr = [1, 2, 3, 4, 10, 9, 8, 9, 10, 11, 7];
var results = [];

for (var i = 0; i < arr.length; i++) {

    // if next element is one more, and one after is two more
    if (arr[i+1] == arr[i]+1 && arr[i+2] == arr[i]+2){

        // store the index of matches
        results.push(i);

        // loop through next numbers, to prevent repeating longer sequences
        while(arr[i]+1 == arr[i+1])
            i++;
    }

}
console.log(results);
于 2012-05-24T20:24:34.957 に答える
2

ifステートメントで自分の表現を注意深く見る必要があります。

それは現在言う:

  • 現在の要素と前の要素の差が1でない場合
  • 現在の要素と次の要素の差が1でない場合

その後、それは結果です。

したがって、一見すると、これは、現在の要素が3つの連続したセットの真ん中にあるかどうかを判断するための誤った論理ステートメントです。

さらに、これは3つの昇順または降順のセットも考慮していません。

つまり、状態がどのようになるかを理解して、そこから進んでください。

考慮すべきいくつかの事柄

  • 私はあなたがからリストを調べ始めることをお勧めしますi = 2
  • リサーチMath.abs
于 2012-05-24T20:22:06.637 に答える
1

これは私がそれを行うためのより簡単な方法だと思います。まず、左右の数値の平均が中央に等しいことを確認してから、いずれかのネイバーの絶対値が1であることを確認します。

var arr = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var indexes = [];

for(var i=1; i < arr.length; i++) {
    if((arr[i-1]+arr[i+1]) / 2 == arr[i] && Math.abs(arr[i]-arr[i-1]) == 1) {
        indexes.push(i-1);
    }
}
alert(indexes);
于 2012-05-24T21:18:29.800 に答える
0
var arr = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var results = [];

for (var i = 0; i < arr.length - 2; i++) {
    if ((arr[i+1] - arr[i] === 1) && (arr[i+2] - arr[i+1] === 1)) {
        results.push({
            i:i,
            mode:'up',
            arr:[arr[i],arr[i+1],arr[i+2]
        });
    }
    if ((arr[i+1] - arr[i] === -1) && (arr[i+2] - arr[i+1] === -1)) {
        results.push({
            i:i,
            mode:'down',
            arr:[arr[i],arr[i+1],arr[i+2]
        });
    }

}
alert(results);
于 2012-05-24T20:23:09.490 に答える