2016-10-10 39 views
1

我試圖找到數組中序列的長度,指定數字的第一次和第二次出現之間的序列長度。問題試圖找到數組中的序列長度

例如:lengthOfSequence([0, -3, 7, 4, 0, 3, 7, 9], 7)將返回5,因爲有第一發生數7

我覺得我寫了應工作的代碼之間的5個索引,但後控制檯日誌記錄它看起來好像我的arr.push()方法只是將第一個索引推送到我的索引數組變量,並將其推入兩次。爲什麼會發生這種情況?

這裏是我的上下文代碼:

var lengthOfSequence = function (arr, n) { 

    var indexes = []; 

    for (var i = 0; i < arr.length; i++) { 
    if (arr[i] === n) { 
     indexes.push(arr.indexOf(arr[i])); 
    } 
    } 

    return arr.indexOf(indexes[1]) - arr.indexOf(indexes[0]); 

} 

因此,舉例來說,如果使用我陣列,我用較早lengthOfSequence([0, -3, 7, 4, 0, 3, 7, 9], 7),我的for循環會發現的7(指數2)和推的第一次出現它到我的索引數組變量,但它只會做兩次。所以我的索引數組只會是[2,2]。爲什麼它不是[2,6]

回答

2

indexOf不符合您的想法。它返回第一個項目的索引,它與所提供的值一起發現。對於數組中的兩個值,它都會返回第一個索引。

因爲只需要索引,並且已在遍歷它與你的循環,你可以簡單地使用i本身:

indexes.push(i); 
+1

也需要休息的時候第二個被發現....如果有更多的相同會給不正確的輸出 – charlietfl

+0

@charlietfl:這不是真的。 OP的代碼不需要休息;但它總會返回前兩次出現的距離。如果超過2個,可以使用返回數組的長度並從第一個中減去最後一個項。 (從技術上講,只有當發現一個事件時它纔是正確的,但是當沒有事件發生時將會拋出錯誤。) – usr2564301

+0

是的..這是真的......數組只會增長並且前兩個元素都是需要的 – charlietfl

1

你可以做到這一點但下面不知道爲什麼它是5你要的那個。我想這應該是4,確定可以使其5.

function lengthOfSequence(a,f){ 
 
    var fi = a.indexOf(f); 
 
    return a.slice(fi) 
 
      .indexOf(f)+(2*fi+1); 
 
} 
 

 
var a = [0, -3, 7, 4, 0, 3, 7, 9], 
 
    f = 7; 
 
console.log(lengthOfSequence(a,f));

0

你可以只使用索引並返回指數加上最後一個元素,第一個區別之一。

var lengthOfSequence = function(arr, n) { 
 
    var indexes = []; 
 
    for (var i = 0; i < arr.length; i++) { 
 
     if (arr[i] === n) { 
 
      indexes.push(i); 
 
     } 
 
    } 
 
    return indexes[indexes.length - 1] - indexes[0] + 1; 
 
} 
 

 
console.log(lengthOfSequence([0, -3, 7, 4, 0, 3, 7, 9], 7)); // 5 
 
console.log(lengthOfSequence([0, -3, 7, 4, 0, 3, 7, 9], -3)); // 1