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