更一份微信的面试题

来源:互联网 发布:qq软件下载 编辑:程序博客网 时间:2024/05/16 01:09

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);elsereturn binarySearch1(array,low,high-1,key);}elsereturn -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;elsehigh = 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);elsereturn findHelper(array, mid + 1, high, key);}else{if ((key >= array[mid+1])&&(key <= array[high]))return binarySearch1(array, mid + 1, high ,key);elsereturn findHelper(array, low, mid, key);}}elsereturn -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






0 0