找到的第一个“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