2017-01-05 12 views
0

これは私の最初の投稿ですので、私と一緒に裸をしてください。 Javascript配列の最初の繰り返し番号を見つける

var arrWithNumbers = [2,5,5,2,3,5,1,2,4]; 

はそう 最初の繰り返し数はそれほど変数 firstIndex私はforループを使用しなければならない値0を持つ必要があり 2です:

は私が最初の2つの数字を見つけるなどのインデックスを表示する必要があります。

var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11]; 
 
var firstIndex 
 

 
for (i = numbers[0]; i <= numbers.length; i++) { 
 
    firstIndex = numbers[0] 
 
    if (numbers[i] == firstIndex) { 
 
    console.log(firstIndex); 
 
    break; 
 
    } 
 
}

+0

数字の範囲に制限はありますか? – instance

+0

@Bálint - 先生が「for」ループを使用する必要があると言っています...; o) – allnodcoms

答えて

0

各項目間を移動し、同じ項目が異なるインデックスに発見された場合もしそうなら、それは重複だとばかりサイクル

var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11]; 
 
var duplicate = null; 
 
for (var i = 0; i < numbers.length; i++) { 
 
    if (numbers.indexOf(numbers[i]) !== i) { 
 
    duplicate = numbers[i]; 
 
    break; // stop cycle 
 
    } 
 
} 
 
console.log(duplicate);
に変数を複製し、破るためにそれを保存し、見つけます

0

var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11]; 
 
var map = {}; 
 
    
 
for (var i = 0; i < numbers.length; i++) { 
 
    if (map[numbers[i]] !== undefined) { 
 
     console.log(map[numbers[i]]); 
 
     break; 
 
    } else { 
 
     map[numbers[i]] = i; 
 
    } 
 
}

これを解読しましょう。私たちがここでやっていることは、インデックスが最初に出現する数値のマップを作成することです。だから、数字の配列をループすると、数字のマップに入っているかどうかがチェックされます。それが見つかった場合は、そのキーの値をマップに返します。それ以外の場合は、最初に発生したインデックスを指しているマップのキーとして番号を追加します。マップを使用するのは、実際に高速O(1)なので、全体的な実行時間はO(n)です。これは、ソートされていない配列でこれを行うことができる最速の方法です。

2

fromIndex引数を使用してArray#indexOfメソッドを使用できます。

var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11]; 
 

 
// iterate upto the element just before the last 
 
for (var i = 0; i < numbers.length - 1; i++) { 
 
    // check the index of next element 
 
    if (numbers.indexOf(numbers[i], i + 1) > -1) { 
 
    // if element present log data and break the loop 
 
    console.log("index:", i, "value: ", numbers[i]); 
 
    break; 
 
    } 
 
}


UPDATE:要素のインデックスは、それははるかに良いになるだろう参照するためにオブジェクトを使用します。

var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11], 
 
    ref = {}; 
 

 
// iterate over the array 
 
for (var i = 0; i < numbers.length; i++) { 
 
    // check value already defined or not 
 
    if (numbers[i] in ref) { 
 
    // if defined then log data and brek loop 
 
    console.log("index:", ref[numbers[i]], "value: ", numbers[i]); 
 
    break; 
 
    } 
 
    // define the reference of the index 
 
    ref[numbers[i]] = i; 
 
}

+0

これはO(n^2)ランタイムになります – winhowes

+0

これは間違っています。 –

+1

@LukasLiesis Pranavはインデックスであり、番号ではありません。そのため、間違った出力が表示されます。私の編集を確認してください – Rajesh

0

あなたが使用できる2 forはチェック各値に対するすべての値をループします。重複した値が見つかった場合、反復は停止します。

この提案では、外側ループを切断するためにlabeled statementが使用されます。

var numbers = [1, 3, 6, 7, 5, 7, 6, 6, 4, 9, 10, 2, 11], 
 
    i, j; 
 

 
outer: for (i = 0; i < numbers.length - 1; i++) { 
 
    for (j = i + 1; j < numbers.length; j++) { 
 
     if (numbers[i] === numbers[j]) { 
 
      console.log('found', numbers[i], 'at index', i, 'and', j); 
 
      break outer; 
 
     } 
 
    } 
 
}

+0

外部の機能をどうやって説明できますか? – RafalRaf

+0

'outer'は、次のループ文のラベルです。その結果は、結果が見つかった場合に両方のforループを停止することです。最初の配列は配列を反復し、2番目の配列は残りの配列の項目が外側の要素の要素と等しいかどうかを調べます。内側の 'for'ループのstartinfインデックスは、同じインデックスのアイテムを比較することを妨げるので、外側のループインデックスより1大きい。 –

0

別の方法として、あなたはindexOflastIndexOfを使用することができますし、値が異なる場合、複数の繰り返しがあり、あなたはループを破ることができます。

function getFirstDuplicate(arr) { 
 
    for (var i = 0; i < arr.length; i++) { 
 
    if (arr.indexOf(arr[i]) !== arr.lastIndexOf(arr[i])) 
 
     return arr[i]; 
 
    } 
 
} 
 

 
var arrWithNumbers = [2, 5, 5, 2, 3, 5, 1, 2, 4]; 
 
console.log(getFirstDuplicate(arrWithNumbers)) 
 

 
var numbers = [1, 3, 6, 7, 5, 7, 6, 6, 4, 9, 10, 2, 11] 
 
console.log(getFirstDuplicate(numbers))

-1
var addIndex = [7, 5, 2, 3, 4, 5, 7,6, 2]; 
var firstmatch = []; 
for (var i = 0; i < addIndex.length; i++) { 

    if ($.inArray(addIndex[i], firstmatch) > -1) { 
     return false; 
    } 
    firstmatch.push(addIndex[i]); 
} 
+1

最初の説明がありません。次に、 'firstIndex'を' numbers [0] 'で初期化し、' 1'からループを開始することができます。これが正しく動作するかどうかも確かではありません。 – Rajesh

+0

はい、既に実行されていて、動作しています。 –

+0

配列の先頭に '1'を追加して再実行してください。あなたのalgoは最初の要素だけをチェックしています。 – Rajesh

0

多くの良い答え、次のように... 1つはまた、非常に機能的かつ効率的にこの仕事をするかもしれません。

var arr = [2,5,5,2,3,5,1,2,4], 
 
    frei = arr.findIndex((e,i,a) => a.slice(i+1).some(n => e === n)); // first repeating element index 
 
console.log(frei)

両方.findIndex().some()機能は、すぐに条件が満たされるように終了しますので、効率的であることが判明する可能性がある場合。

+0

これは非常に高価になります。 'findIndex' +' slice' + 'some' – Rajesh

関連する問題