面接の質問としてもらった...
ソートされた無限配列(位置はわかりません)からは、特別な記号'$'のみが存在し、その配列内の要素を見つける必要があります...
私は$の最初の出現を取得し、次に$から前の部分で二分探索を行うような解決策を与えました
$の最初の出現を見つけるために、(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ではないのはなぜですか
誰かが再発関係についていくつかの光を通してplsすることができますか..plsは助けます..