Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在0和1的排序数组中查找1位置的解决方案_Arrays_Algorithm - Fatal编程技术网

Arrays 在0和1的排序数组中查找1位置的解决方案

Arrays 在0和1的排序数组中查找1位置的解决方案,arrays,algorithm,Arrays,Algorithm,我接到亚马逊的电话,参加了他们的一次面试,并进行了一次测试,以编写以下问题的最有效解决方案 在0和1的排序数组中查找1的最小位置。e、 g.在数组0000001111中,输出应为6 我尝试了二进制搜索,但它没有利用数组只有0和1的属性。你能给我一些更好的解决办法吗 谢谢 Niraj Rathi与二进制文件相同,请尝试此 while { if array[array.length/2] == 1 { if array[array.length/2 - 1 ] == 0

我接到亚马逊的电话,参加了他们的一次面试,并进行了一次测试,以编写以下问题的最有效解决方案

在0和1的排序数组中查找1的最小位置。e、 g.在数组0000001111中,输出应为6

我尝试了二进制搜索,但它没有利用数组只有0和1的属性。你能给我一些更好的解决办法吗

谢谢
Niraj Rathi

与二进制文件相同,请尝试此

while
{
   if array[array.length/2] == 1
   {
        if array[array.length/2 - 1 ] == 0
             return
        array = 1st half of array
   }
   else
   {
       if array[array.length/2 + 1 ] == 0
             return
       array = 2nd half of array
   }
}

您可能在寻找是否有比此更好的想法我真的很想学习

您可以利用值为0和1的事实,以更简洁的方式编写标准二进制搜索:

int firstOne(int[] arr) {
    int[] a = new int[2];
    a[0] = 0;
    a[1] = arr.length;

    while (a[1] - a[0] > 1) {
        int m = (a[1] + a[0]) / 2;
        a[arr[m]] = m;
    }

    return a[1];
}

由于使用了数组
a
,我们得到了
arr[a[0]]=0
arr[a[1]=1
的不变量。如果循环结束,
a[0]
a[1]
指向两个连续的数组元素,因此
a[1]
是第一个1。请注意,我忽略了特殊情况(全部0、全部1或一个空输入)。

任何特定的编程语言?为什么输出1表示
0000001111
?这个“数组”中的位置1在哪里?从左起从0开始计数,最小位置为6。1来自哪里?你能解释一下你所说的最小位置是什么意思吗?在我看来,最小的位置是6如果你从右边数数,它被排序,答案总是1或某种类型的未找到错误。我相当确定二进制搜索是最佳解决方案。我尝试了类似的方法,但让我一直思考的是,我根本没有使用数组的属性,即它是排序的二进制数组。我认为因为它是数组,所以元素将位于连续的位置。想象一下,在内存区域,一部分完全为零,另一半的LSB设置为1。因此,也许我们可以利用这一点提出有效的解决方案。memcmp的效率不如在处理器缓存外执行的那么高。@NIRAJRATHI我认为二进制文件在这里无法改进。数组的形式是aaaaaaaabbbbb,您需要找到A和B之间的边界,可以是数组中的任何位置。二进制在这里真的无法改进,因为没有额外的信息可以帮助您更快地找到边界。零并不意味着没有内存。。。1和0在内存中的大小相同