2016-07-25 47 views
1

找到的第一個「1」,我有一個數組"0000011111"零陣列

我需要找到"1"第一次出現。

我該如何以有效的方式做到這一點?

我的解決辦法是:(我認爲這是一個更好的辦法)

$array = array(0,0,1,1,1); 


for($i=0;$i<count($array);$i++) 
{ 
    if($array[$i] == 1) 
    { 
     var_dump($i); 
     return; 
    } 
} 
+3

假設數組中元素的順序不變,這已經是最有效的解決方案了。 – smarx

+1

@sircodesalot:二進制搜索只適用於數組排序的情況,而對於數組量小的數組則無能爲力。 –

+1

@sircodesalot我猜如果數組中的元素碰巧被排序,那麼二進制搜索就會適用?我沒有看到任何暗示的問題。 – smarx

回答

0

不幸的是,因爲沒有必要進行任何的數字是"1"因爲你只能通過數組去一次,這是最有效的解決方案。二進制搜索或任何這樣的算法不會工作,因爲這個數組很顯然沒有排序。
採樣輸入:

  1. 0101101
  2. 1000101
    在這兩種情況下,二進制搜索是行不通的。
+2

這不需要斜體。 –

+0

*我喜歡我的帖子斜體。* –

+0

顯然'0000011111'沒有排序。 –

-2

如果你能以某種方式有效地轉換數組一個數字,它可以與底數有效地找到第1 2

var number = 0b010000010; 
 
console.log(Math.floor(Math.log2(number)))

編輯主這樣做的理由是因爲有做硬件指令來做日誌庫2,使它保持不變。

當然,如果你不能將數組存儲爲二進制字符串,因爲它太長或類似的東西,這個解決方案不適合你。

+0

你能想到一種將數組轉換爲比OP更快的整數的方法嗎? –

+0

爲什麼downvote?如果你可以將你的數組存儲爲二進制字符串,這完全有效,並且有硬件支持。 – Mobius

+0

第一個應該在位置0,不是嗎?或者你在逆轉數組? –

1

你的解決方案已經儘可能地有效,但有一個built-in method在PHP會爲你做到這一點:

$array = array(0,0,1,1,1); 

var_dump(array_search(1, $array)); // int(2) 

注意array_search會的情況下返回布爾FALSE那裏有中沒有1秒陣列。

編輯

我的假設,原來的代碼是PHP,只是因爲它看上去那樣。 :-)