1 給定一個遞增循環整數數組,最小的整數可能出現在數組的中間,例如,
int array[] = {7, 9, 10, 51, 56, 0, 2};
求查找某個值的算法,給定函數頭如下
int find(int array[], int len, int key);
找到了就返回元素下標,沒找到就返回-1。
這是一道很基本的考分治的題,複雜度可以爲logN,這裏順帶整理一下算法界的hello world——二分查找
二分查找可以有兩種做法:遞歸和循環(感覺除了函數頭不一樣,其他地方都差不多)
遞歸代碼:
int binarySearch1(int array[], int low, int high, int key) //recursion
{
if (low <= high)
{
int mid = (low + high)/2;
if (key == array[mid])
return mid;
else if (key > array[mid])
return binarySearch1(array,mid+1,high,key);
else
return binarySearch1(array,low,high-1,key);
}
else
return -1;
}
循環代碼:
int binarySearch2(int array[], int len, int key) //circle
{
int low = 0, high = len - 1, mid;
while (low <= high)
{
mid = (low + high)/2;
if (key == array[mid])
return mid;
else if (key > array[mid])
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
接下來就是微信的這道題了,先確定一個有序的半邊數組,如果key落在這半邊,則直接用二分查找法,如果落在另外半邊,則遞歸一次。
代碼如下:
int findHelper(int array[], int low, int high, int key) //convient for recursion
{
if (low <= high)
{
int mid = (low + high)/2;
if (array[mid] > array[high]) //increase in the left part
{
if ((key >= array[low])&&(key <= array[mid]))
return binarySearch1(array, low, mid, key);
else
return findHelper(array, mid + 1, high, key);
}
else
{
if ((key >= array[mid+1])&&(key <= array[high]))
return binarySearch1(array, mid + 1, high ,key);
else
return findHelper(array, low, mid, key);
}
}
else
return -1;
}
int find(int array[], int len, int key)
{
int low = 0, high = len -1;
findHelper(array, low, high, key);
}
這裏用findHelper來實現只是爲了換下函數頭,微信原題裏限定了函數頭,遞歸不好實現
最後是main函數,也就是測試函數:
int main() {
int array[] = { 7, 9, 11, 19, 8750, 1, 4, 6};
cout << find(array, sizeof(array)/sizeof(*array), 8);
return 0;
}
這裏在Eclipse測試,代碼沒問題~簡單代碼就不貼測試結果啦。這道題就這樣完結.
2 編寫一個能將給定非負整數列表中的數字排列成最大數字的函數。例如,給定[50,2,1,9],最大數字爲95021。
給定函數頭:
string LargestNum(vector <int> num);
3 有字符串表示的一個四則運算表達式,要求計算出該表達式的正確數值。四則運算即:加減乘除"+-*/",另外該表達式中的數字只能是1位(數值範圍0~9)。另若有不能整除的情況,按向下取整處理,eg: 8/3得出值爲2。例如若有字符串"8+7*2-9/3",計算出其值爲19。給定函數頭:
double Cal(const char* str);
這道題的答案見這裏:http://blog.csdn.net/lyintong/article/details/51046037