Arrays 在0和1的排序数组中查找1位置的解决方案
我接到亚马逊的电话,参加了他们的一次面试,并进行了一次测试,以编写以下问题的最有效解决方案 在0和1的排序数组中查找1的最小位置。e、 g.在数组0000001111中,输出应为6 我尝试了二进制搜索,但它没有利用数组只有0和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
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在内存中的大小相同