更一份微信的面試題

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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章