更一份微信的面试题

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






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