2016-07-25 57 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,只是因为它看上去那样。 :-)