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

c++ 之面试题(3)数组递归查找的更多相关文章
- 递归分治算法之二维数组二分查找(Java版本)
[java] /** * 递归分治算法学习之二维二分查找 * @author Sking 问题描述: 存在一个二维数组T[m][n],每一行元素从左到右递增, 每一列元素从上到下递增,现在需要查找元素 ...
- [LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分);面试题53 - II. 0~n-1中缺失的数字(二分)
##面试题53 - I. 在排序数组中查找数字 I ###题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 ...
- [javaSE] IO流(递归查找指定文件)
递归方法,实现查找目录中以.java为后缀的文件路径,并存入文本文件中 定义一个静态方法fileToLine(),传入参数:File对象目录,List集合对象(List<File> 这样做 ...
- js经典试题之数组与函数
js经典试题之数组与函数 1:列举js的全局函数? 答案:JavaScript 中包含以下 7 个全局函数escape( ).eval( ).isFinite( ).isNaN( ).parseFlo ...
- Leetcode算法【34在排序数组中查找元素】
在之前ARTS打卡中,我每次都把算法.英文文档.技巧都写在一个文章里,这样对我的帮助是挺大的,但是可能给读者来说,一下子有这么多的输入,还是需要长时间的消化. 那我现在改变下方式,将每一个模块细分化, ...
- LeetCode 面试题51. 数组中的逆序对
面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ 题目 在数组中的两个数字,如果 ...
- 力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I
题目 剑指 Offer 53 - I. 在排序数组中查找数字 I 思路1 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录target数组出现的次数,但是这样的时间复杂度是O(n),还是 ...
- JS数组2(冒泡排列、数组里面查找数据)
数组 一.冒泡排列 对数组attr = [1,8,6,4,5,3,7,2,9]进行由大到小排列,用冒泡排列的方法排列时,会对数组进行比较互换.如果前一个数字较大,这2个元素排列方式不变,如果后一个元素 ...
- SQL Server使用WITH AS递归查找
很多时候我们会在数据库表中存储树结构的数据,如菜单:一级菜单.二级菜单.三级菜单... 如果树结构层次比较多,如何能够在只知道某节点的情况下,找到此节点下的所有子级数据呢? 在.NET后台可以定义一个 ...
随机推荐
- BZOJ 4556 [HEOI2016/TJOI2016]字符串
BZOJ 4556 [HEOI2016/TJOI2016]字符串 其实题解更多是用后缀数组+数据结构的做法,貌似也不好写. 反正才学了 sam 貌似比较简单的做法. 还是得先二分,然后倍增跳到 $ s ...
- 搭建zabbix服务器常见问题解析处理
1. 找不到url 2. 服务器无法处理当前请求,PHP解析出错 3. 服务器无法处理当前请求,权限不足 1. 找不到url 浏览器报错:The requested URL /zabbix/ was ...
- 日常Java 2021/11/17
应用程序转换成Applet 将图形化的Java应用程序(是指,使用AWT的应用程序和使用java程序启动器启动的程序)转换成嵌入在web页面里的applet是很简单的.下面是将应用程序转换成.Appl ...
- day03 部署NFS服务
day03 部署NFS服务 NFS的原理 1.什么是NFS 共享网络文件存储服务器 2.NFS的原理 1.用户访问NFS客户端,将请求转化为函数 2.NFS通过TCP/IP连接服务端 3.NFS服务端 ...
- 【转载】HBase基本数据操作详解【完整版,绝对精品】
转载自: http://blog.csdn.net/u010967382/article/details/37878701 概述 对于建表,和RDBMS类似,HBase也有namespace的概念,可 ...
- Node.js 概述
JavaScript 标准参考教程(alpha) 草稿二:Node.js Node.js 概述 GitHub TOP Node.js 概述 来自<JavaScript 标准参考教程(alpha) ...
- Angular @Input讲解及用法
1.什么是@input @input的作用是定义模块输入,是用来让父级组件向子组件传递内容. 2.@input用法 首先在子组件中将需要传递给父组件的变量用@input()修饰 需要在子组件ts文件i ...
- Shell学习(七)——sort、uniq、cut、wc命令详解
Shell学习(七)--sort.uniq.cut.wc命令详解 转自:[1]linux sort,uniq,cut,wc命令详解 https://www.cnblogs.com/ggjucheng/ ...
- Function overloading and return type
In C++ and Java, functions can not be overloaded if they differ only in the return type. For example ...
- @Order注解使用
注解@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响: @ ...