【发布时间】:2012-09-21 17:24:27
【问题描述】:
这是面试题...
已排序的无限数组,并且从某个位置(我们不知道该位置)只有特殊符号“$”才会出现,我们需要在该数组中找到一个元素...
我给出了一个解决方案,例如获取 $ 的第一次出现,然后从 $ 对前一部分进行二进制搜索
要找到 $ i 的第一次出现,如果 (i,2i) 给出了增加窗口大小的解决方案
我给出的代码是
#include<stdio.h>
int first(int *arr,int start,int end,int index)
{
int mid=(start+end)/2;
if((mid==start||arr[mid-1] != '$') && arr[mid]=='$')
return mid;
if(arr[mid]=='$')
return first(arr,start,mid-1,index);
else
{
if(arr[end] =='$')
return first(arr,mid+1,end,index);
else
return first(arr,end+1,(1<<index),index+1);
}
}
int binsearch(int *arr,int end ,int n)
{
int low,high,mid;
high=end-1;
low=0;
while(low<= high)
{
mid=(low+high)/2;
if(n<arr[mid])
high=mid-1;
else if (n >arr[mid])
low=mid+1;
else
return mid;
}
return -1;
}
int main()
{
int arr[20]={1,2,3,4,5,6,7,8,9,10,'$','$','$','$','$','$','$','$','$','$'};
int i =first(arr,0,2,2);
printf("first occurance of $ is %d\n",i);
int n=20;//n is required element to be found
if(i==0||arr[i-1]<n)
printf(" element %d not found",n);
else{
int p=binsearch(arr,i,n);
if(p != -1)
printf("element %d is found at index %d",n,p);
else
printf(" element %d not found",n);
}
return 0;
}
有没有更好的方法来解决上述问题??
我也想知道找到 $ 的第一次出现为什么我们应该只以 2 的幂移动窗口为什么不像 (i,3i) 这样的 3 来移动窗口
有人可以对重复关系有所了解吗..请帮助..
【问题讨论】:
-
问题的第二部分(在找到 $ 符号之后)与 this thread 相关 [注意 - 这不是骗局,但不是投票关闭或任何事情]