c++ 之面试题(3)数组递归查找
题目描述
1、 给定严格升序(没有相等元素)的数组a,元素个数为cnt,
查找num在数组中的位置序号(以0位起始)。
如果没找到则返回: 比num小且最靠近的元素位置序号。
若所有元素均大于num则返回-1;请用递归方式实现。
int search(int arr[], int cnt, int num)
{
}
代码
我递归用的不好。这是一位大佬写的。 很巧妙。
- 函数的第一个参数为地址,这样,数组二分就可以传递地址了
- 除了极端情况,巧妙的比较了与num的关系
/**
1、 给定严格升序(没有相等元素)的数组a,元素个数为cnt,
查找num在数组中的位置序号(以0位起始)。
如果没找到则返回: 比num小且最靠近的元素位置序号。
若所有元素均大于num则返回-1;请用递归方式实现。
*/
int search(int arr[], int cnt, int num)
{
std::cout << "a[0]=" << arr[0] << ", a[1]=" << arr[1] << ", cnt=" << cnt << "\n\n";
// 1.数组的最小值比num还大,那么,数组不存在该元素。
if (arr[0] > num)
return -1;
// 2.数组中最大的元素都小于 num, 则 返回靠近num的索引,也就是数组的最大索引
if (num >= arr[cnt - 1])
return cnt-1;
// 3.巧妙的比较相邻的两个元素
if (2 == cnt)
return ((num - arr[0]) < (arr[1] - num)) ? 0 : 1;
int mid = cnt / 2;
// 4. num应该搜索中间值的右边,
if (arr[mid] < num)
return mid + search(arr + mid, cnt - mid, num);
// num应该搜索数组中间值的左边
else if (arr[mid] > num)
return search(arr, mid + 1, num);
// 找到,mid就是要找的索引
else
return mid;
}
调用
准备了1一个数组1,2,3,4,5。 其中输入100退出while循环
int arr[] = { 1, 2, 3, 4, 5 };
while (1)
{
int input = 1;
std::cout << "the array is from 1 to 5. out?100 :";
std::cin >> input;
if (100 == input)
break;
int ret = search(arr, sizeof(arr) / sizeof(int), input);
std::cout << "ret=" << ret;
std::cout << "\n\n\n";
}