找到的第一個「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;
}
}
找到的第一個「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;
}
}
不幸的是,因爲沒有必要進行任何的數字是"1"
因爲你只能通過數組去一次,這是最有效的解決方案。二進制搜索或任何這樣的算法不會工作,因爲這個數組很顯然沒有排序。
採樣輸入:
0101101
1000101
這不需要斜體。 –
*我喜歡我的帖子斜體。* –
顯然'0000011111'沒有排序。 –
如果你能以某種方式有效地轉換數組一個數字,它可以與底數有效地找到第1 2
var number = 0b010000010;
console.log(Math.floor(Math.log2(number)))
編輯主這樣做的理由是因爲有做硬件指令來做日誌庫2,使它保持不變。
當然,如果你不能將數組存儲爲二進制字符串,因爲它太長或類似的東西,這個解決方案不適合你。
你能想到一種將數組轉換爲比OP更快的整數的方法嗎? –
爲什麼downvote?如果你可以將你的數組存儲爲二進制字符串,這完全有效,並且有硬件支持。 – Mobius
第一個應該在位置0,不是嗎?或者你在逆轉數組? –
你的解決方案已經儘可能地有效,但有一個built-in method在PHP會爲你做到這一點:
$array = array(0,0,1,1,1);
var_dump(array_search(1, $array)); // int(2)
注意array_search
會的情況下返回布爾FALSE
那裏有中沒有1秒陣列。
編輯
我的假設,原來的代碼是PHP,只是因爲它看上去那樣。 :-)
假設數組中元素的順序不變,這已經是最有效的解決方案了。 – smarx
@sircodesalot:二進制搜索只適用於數組排序的情況,而對於數組量小的數組則無能爲力。 –
@sircodesalot我猜如果數組中的元素碰巧被排序,那麼二進制搜索就會適用?我沒有看到任何暗示的問題。 – smarx