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后台可以定义一个 ...
随机推荐
- GWAS与GS模型介绍与比较
目录 1.GWAS模型 1.1卡方检验 1.2 相关性系数的t检验 1.3 一般线性模型GLM 1.4 混合线性模型MLM 1.5 压缩混合线性模型CMLM 1.6 SUPER 1.7 FarmCPU ...
- mysql_sql查性能语句
mysql> SHOW PROCESSLIST; +----+--------+----------------------+-------+-------------+--------+--- ...
- MongoDB的搭建、参数
Mongodb官网:https://www.mongodb.com/ mkdir -r /data/db touch /data/log tar -zxvf mongodb-linux-x86_6 ...
- (转载)java排序实现
Java实现几种常见排序方法 日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 冒泡排序是一种简单的排序算法. ...
- 汇编LED实验
汇编语言点亮LED 拿到一款全新的芯片,第一个要做的事情的就是驱动其 GPIO,控制其 GPIO 输出高低电平. GPIO口是IO口的一个功能之一. 一.接下来的步骤离不开芯片手册: 1.使能所有时钟 ...
- 【模板】单源最短路径(Dijkstra)/洛谷P4779
题目链接 https://www.luogu.com.cn/problem/P4779 题目大意 给定一个 \(n\) 个点 \(m\) 条边有向图,每个点有一个非负权值,求从 \(s\) 点出发,到 ...
- 虚拟节点轻松应对 LOL S11 百万并发流量——腾竞体育的弹性容器实践
作者 刘如梦,腾竞体育研发工程师,擅长高并发.微服务治理.DevOps,主要负责电竞服务平台架构设计和基础设施建设. 詹雪娇,腾讯云弹性容器服务EKS产品经理,主要负责 EKS 虚拟节点.容器实例相关 ...
- day14 linux三剑客之sed命令
day14 linux三剑客之sed命令 sed命令 Sed 主要用来自动编辑一个或多个文件.简化对文件的反复操作.编写转换程序等. sed(流式编辑器) : sed主要用来修改文件. 1.sed命令 ...
- Vue框架,computed和watch的区别
computed和watch定义 1.computed是计算属性,类似于过滤器,对绑定到视图的数据进行处理.官网的例子: <div id="example"> < ...
- jQuery无限载入瀑布流 【转载】
转载至 http://wuyuans.com/2013/08/jquery-masonry-infinite-scroll/ jQuery无限载入瀑布流 好久没更新日志了,一来我比较懒,二来最近也比较 ...