去哪網2015年春季校園招聘筆試題
來源:程序員人生 發布時間:2015-05-19 07:58:51 閱讀次數:2418次
請實現以下函數 int indexOf(int
[]array ,int x),給定1個循環有序的數組,請在這個數組中找到指定元素,找到的話返回下表,沒有找到返回⑴.該數組的特點是1個單調遞增的數組向右循環移位構成的.舉例說明,原數組是{4,8,13,20,23,34,41,52}.經過向右循環移位構成的數組多是{23,34,41,52,4,8,13,20}或{4,8,13,20,23,34,41,52}.
剛拿到題目覺得太簡單,循環1邊每一個判斷是不是等于x,如果等于返回下表,否則返回⑴.可是我們不知道數組的大小,這個時候我機靈的想到了以下代碼。
#include <iostream>
using namespace std;
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,10};
int n=sizeof(a)/sizeof(int);
printf("%d
",n);
return 0;
}
上面代碼中數組大小沒有給出,用sizeof可以正確計算出數組的大小,下面的代碼就顯得瓜熟蒂落了.
#include <iostream>
using namespace std;
int indexOf(int a[],int x)
{
int n=sizeof(a)/sizeof(int);
for (int i = 0; i < n; ++i)
{
if(a[i]==x)
return i;
}
return ⑴;
}
int main()
{
int a[10]={10,1,2,3,4,5,6,7,8,9};
printf("%d
",indexOf(a,3));
}
當我們運行代碼時發現打印了⑴,為何代碼不能依照預期的運行呢?
在函數傳遞的進程中,參數表中的數組將退化為指向該數組元素類型的指針,代碼中的數組大小難以求出,看以下例子.
#include <iostream>
using namespace std;
int indexOf(int a[],int x)
{
int n=sizeof(a)/sizeof(int);
printf("%d
",n);
printf("%d
",sizeof(int));
return 0;
}
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
indexOf(a,5);
return 0;
}
在我電腦上運行結果顯示sizeof(a)是數組a首地址所占字節數,sizeof(int)是int類型所占字節數.
那末這道題看語法應當是C#,數組長度不是關注點,重點是利用2分查找改進算法int
binarysearch(int *a ,int n, int x)來完成.
#include <iostream>
using namespace std;
int binarysearch(int *a ,int n, int x)
{
int low = 0, high = n - 1;
while(low < high)
{
int mid = (low + high)/2;
if(a[low] == x)
return low;
if(a[high] == x)
return high;
if(a[mid] == x)
return mid;
if(a[mid] > a[low] )
{
if( x > a[low] && x < a[mid])
high = mid⑴ ;
else
low = mid+1 ;
}
else if(a[mid] < a[high])
{
if( x > a[mid] && x < a[high])
low = mid+1 ;
else
high = mid⑴ ;
}
else
{
if (x != a[mid])
return ⑴;
else
return mid;
}
}
return ⑴;
}
int main()
{
int a[8] = {23,34,41,52,4,8,13,20};
int index = binarysearch(a,8,41);
cout<< index << endl;
return 0;
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈