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";
}

结果

posted @ 2020-12-24 09:41  mohist  阅读(561)  评论(0编辑  收藏  举报