在面試中面試官常常讓我們寫幾個小的程序,以此來考察我們的編程內功。所以在準備面試的過程中在紙上練習着寫一些程序是很有必要的。
下面是在面試中常考的幾個題,出現頻率非常之高!!!!
1、完整正確的寫出二分查找的算法
int binary_search(int arr[],int n,int key) { assert(arr!=NULL && n>0);//注意斷言的作用 int left=0; int right=n-1; int mid=0; while(left<=right) { mid = left + ((right-left)>>1);//不直接用(left+right)/2是防止越界和提高效率 if(arr[mid]<key) left=mid+1; else if(arr[mid]>key) right=mid-1; else return mid; } return -1; }
程序中要注意的地方:
//right=n-1 => while(left <= right) => right=middle-1;
//right=n => while(left < right) => right=middle;
middle= (left+right)>>1; 這樣的話 left 與 right 的值比較大的時候,其和可能溢出。
2、寫出你認爲效率高且常用的一種排序算法(快速排序、歸併排序)
void QSort(int arr[],int low,int high)
{
int pivot;
while(low<high)//優化了遞歸操作
{
pivot=Partition(arr,low,high);
QSort(arr,low,pivot-1);
low=pivot+1;
}
}
int Partition(int arr[],int low,int high)
{
assert(arr!=NULL && low<high);
int pivotkey=arr[low];//對於關鍵字的選取我們可以採取3數取中法或9數取中法,還可以隨機取數來保證關鍵字正好是數組的接近中間位置。
while(low<high)
{
while(low<high && arr[high]>=pivotkey)
high--;
arr[low]=arr[high];//採用替換而不是交換的操作(優化不必要的交換)
while(low<high && arr[low]<=pivotkey)
low++;
arr[high]=arr[low];//採用替換而不是交換的操作
}
arr[low]=pivotkey;
return low;
}
//3數取中法的代碼
int m = low+((high-low)>>1);
if(arr[low]>arr[high])
swap(arr[low],arr[high]);
if(arr[m]>arr[high])
swap(arr[m],arr[high]);
if(arr[m]>arr[low])
swap(arr[m],arr[low]);
3、反轉鏈表
struct ListNode { int m_nValue; ListNode* m_pNext; };//鏈表的結構體 ListNode *ReverseList(ListNode *pHead) { assert(pHead!=NULL);//防止傳入的是一個空指針,參數檢查很重要!!!一定不要忘記寫 ListNode *pReversedList = NULL; //指向反轉後的鏈表的頭結點 ListNode *pNode = pHead; //指向斷開後鏈表的後面一段鏈表的第一個結點 ListNode *pPrev = NULL; //指向斷開後鏈表的前面一段鏈表的最後一個結點 while(pNode!=NULL) { ListNode *pNext = pNode->m_pNext; if(pNext == NULL) pReversedList = pNode; pNode->m_pNext = pPrev; pPrev = pNode; pNode = pNext; } return pReversedList; }
4、題目描述:
要求實現庫函數 strcpy,
原型聲明:extern char *strcpy(char *dest,char *src);
功能:把 src 所指由 NULL 結束的字符串複製到 dest 所指的數組中。
說明: src 和 dest 所指內存區域不可以重疊且 dest 必須有足夠的空間來容納 src 的字符串。
返回指向 dest 的指針。
[cpp] view plaincopyprint?
- //得 10 分,基本上所有的情況,都考慮到了
- //如果有考慮到源目所指區域有重疊的情況,加 1 分!
-
char * strcpy( char *strDest, const char *strSrc )//將源字符串加const,表明其爲輸入參數
- {
- if(strDest == strSrc)
- { return strDest; }
-
assert( (strDest != NULL) && (strSrc != NULL) );//對源地址和目的地址加非0斷言
- char *address = strDest;
- while( (*strDest++ = * strSrc++) != '\0');
-
return address; //爲了實現鏈式操作,將目的地址返回
- }
- 類似的我們還可以寫出strlen函數的完美版本
-
int strlen( const char *str ) //輸入參數const
- {
-
assert( strt != NULL ); //斷言字符串地址非0
- int len;
- while( (*str++) != '\0' )
- {
- len++;
- }
- return len;
- }
//得 10 分,基本上所有的情況,都考慮到了 //如果有考慮到源目所指區域有重疊的情況,加 1 分! char * strcpy( char *strDest, const char *strSrc )//將源字符串加const,表明其爲輸入參數 { if(strDest == strSrc) { return strDest; } assert( (strDest != NULL) && (strSrc != NULL) );//對源地址和目的地址加非0斷言 char *address = strDest; while( (*strDest++ = * strSrc++) != '\0'); return address; //爲了實現鏈式操作,將目的地址返回 } 類似的我們還可以寫出strlen函數的完美版本 int strlen( const char *str ) //輸入參數const { assert( strt != NULL ); //斷言字符串地址非0 int len; while( (*str++) != '\0' ) { len++; } return len; }
關於字符串操作的庫函數數有許多,我們可以參照上面的幾點寫出其它的字符串操作庫函數的完美版本。