2016-07-05 86 views
0

讓我們假設我們有這些元素的數組(總是排序)。在數組中查找範圍

[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3] 

我們的目標是找到給定值的最小索引和最大索引,例如,讓我們假設我們正在尋找的元素3.

我們很快看到的最小指數和最大指數,將最低指數爲3,並在最大指數爲11。

對於值1,最小值爲0,最大值爲3.

您將如何開發一個解決方案,返回JavaScript中的最小值和最大值?我試圖做到這一點,但我無法想象如何,我總是得到錯誤的答案。

+4

這不是http://codegolf.stackexchange.com/ – deltree

+0

[Array.indexOf()](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf )和[Array.lastIndexOf()](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf)是您的答案,下次發佈代碼。 – Gintoki

+2

這是功課....? – Darren

回答

7

你可以嘗試Array.indexOf()Array.lastIndexOf()

var sortedArr =[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]; 
 

 
console.log(sortedArr.indexOf(1)); 
 
console.log(sortedArr.lastIndexOf(1));

+1

明顯的答案 – MrFabio

-1
var data={1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3}; 
var value=3; 
var min=data.length; 
var max=0; 

for(var key in data){ 
    if(data[key]==value){ 
     if(key<min){ 
      min=key; 
     } 
    if(key > max){ 
      max=key; 
    } 
    } 
console.log(min); 
console.log(max); 
+0

請解釋你的代碼爲什麼回答這個問題。 –

+0

對不起,我做了它,但它有一些錯誤 – Hassan

+0

正確的是: – Hassan

0

這是你想要的嗎?

var myarr = [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]; 
 
var minNum = myarr[0]; 
 
var maxNum = myarr[1]; 
 
var minNumStartINDX, maxNumStartINDX, minNumEndINDX, maxNumEndINDX; 
 
/********************************************/ 
 
for (var x = 0; x < myarr.length; ++x) { 
 
    if (minNum >= myarr[x]) { 
 
    minNum = myarr[x]; 
 
    minNumEndINDX = x; 
 
    } 
 
} 
 
for (var x = 0; x < myarr.length; ++x) { 
 
    if (minNum >= myarr[x]) { 
 
    minNumStartINDX = x; 
 
    break; 
 
    } 
 
} 
 
for (var x = 0; x < myarr.length; ++x) { 
 
    if (maxNum <= myarr[x]) { 
 
    maxNum = myarr[x]; 
 
    maxNumEndINDX = x; 
 
    } 
 
} 
 
for (var x = 0; x < myarr.length; ++x) { 
 
    if (maxNum <= myarr[x]) { 
 
    maxNumStartINDX = x; 
 
    break; 
 
    } 
 
} 
 
/********************************************/ 
 
console.log(minNum); 
 
console.log(minNumStartINDX + "-" + minNumEndINDX); 
 
console.log(maxNum); 
 
console.log(maxNumStartINDX + "-" + maxNumEndINDX);

1

基本上Array.indexOf()Array.lastIndexOf()將做到這一點,但他們會做一個線性搜索(經過一個循環整個陣列,直到元素被發現),這是線性時間O(n)顯然做。

如果你的數組總是被排序,那麼我們可以使用這個屬性來優化它,並使用二分搜索。這是更快的方式,並將在對數時間O(log n)

之後,我們簡單地檢查找到的索引之前(和之後)的元素,直到找到一個不等於我們元素的元素。

爲了找到最後一個實例:

var i= foundIndex; 
while(sortedArr[i] == sortedArr[foundIndex]){ 
    i++; 
} 
foundIndex = i; 

而對於第一次出現:

var i= foundIndex; 
while(sortedArr[i] == sortedArr[foundIndex]){ 
    i--; 
} 
foundIndex = i; 

這就是它!這對運行時會有很大的幫助,特別是如果你有大陣列的話。 您可以在任何地方找到二進制搜索實現,只需使用它們中的任何一個即可。