题目描述

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)数组递归查找的更多相关文章

  1. 递归分治算法之二维数组二分查找(Java版本)

    [java] /** * 递归分治算法学习之二维二分查找 * @author Sking 问题描述: 存在一个二维数组T[m][n],每一行元素从左到右递增, 每一列元素从上到下递增,现在需要查找元素 ...

  2. [LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分);面试题53 - II. 0~n-1中缺失的数字(二分)

    ##面试题53 - I. 在排序数组中查找数字 I ###题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 ...

  3. [javaSE] IO流(递归查找指定文件)

    递归方法,实现查找目录中以.java为后缀的文件路径,并存入文本文件中 定义一个静态方法fileToLine(),传入参数:File对象目录,List集合对象(List<File> 这样做 ...

  4. js经典试题之数组与函数

    js经典试题之数组与函数 1:列举js的全局函数? 答案:JavaScript 中包含以下 7 个全局函数escape( ).eval( ).isFinite( ).isNaN( ).parseFlo ...

  5. Leetcode算法【34在排序数组中查找元素】

    在之前ARTS打卡中,我每次都把算法.英文文档.技巧都写在一个文章里,这样对我的帮助是挺大的,但是可能给读者来说,一下子有这么多的输入,还是需要长时间的消化. 那我现在改变下方式,将每一个模块细分化, ...

  6. LeetCode 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ 题目 在数组中的两个数字,如果 ...

  7. 力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I

    题目 剑指 Offer 53 - I. 在排序数组中查找数字 I 思路1 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录target数组出现的次数,但是这样的时间复杂度是O(n),还是 ...

  8. JS数组2(冒泡排列、数组里面查找数据)

    数组 一.冒泡排列 对数组attr = [1,8,6,4,5,3,7,2,9]进行由大到小排列,用冒泡排列的方法排列时,会对数组进行比较互换.如果前一个数字较大,这2个元素排列方式不变,如果后一个元素 ...

  9. SQL Server使用WITH AS递归查找

    很多时候我们会在数据库表中存储树结构的数据,如菜单:一级菜单.二级菜单.三级菜单... 如果树结构层次比较多,如何能够在只知道某节点的情况下,找到此节点下的所有子级数据呢? 在.NET后台可以定义一个 ...

随机推荐

  1. BZOJ 4556 [HEOI2016/TJOI2016]字符串

    BZOJ 4556 [HEOI2016/TJOI2016]字符串 其实题解更多是用后缀数组+数据结构的做法,貌似也不好写. 反正才学了 sam 貌似比较简单的做法. 还是得先二分,然后倍增跳到 $ s ...

  2. 搭建zabbix服务器常见问题解析处理

    1. 找不到url 2. 服务器无法处理当前请求,PHP解析出错 3. 服务器无法处理当前请求,权限不足 1. 找不到url 浏览器报错:The requested URL /zabbix/ was ...

  3. 日常Java 2021/11/17

    应用程序转换成Applet 将图形化的Java应用程序(是指,使用AWT的应用程序和使用java程序启动器启动的程序)转换成嵌入在web页面里的applet是很简单的.下面是将应用程序转换成.Appl ...

  4. day03 部署NFS服务

    day03 部署NFS服务 NFS的原理 1.什么是NFS 共享网络文件存储服务器 2.NFS的原理 1.用户访问NFS客户端,将请求转化为函数 2.NFS通过TCP/IP连接服务端 3.NFS服务端 ...

  5. 【转载】HBase基本数据操作详解【完整版,绝对精品】

    转载自: http://blog.csdn.net/u010967382/article/details/37878701 概述 对于建表,和RDBMS类似,HBase也有namespace的概念,可 ...

  6. Node.js 概述

    JavaScript 标准参考教程(alpha) 草稿二:Node.js Node.js 概述 GitHub TOP Node.js 概述 来自<JavaScript 标准参考教程(alpha) ...

  7. Angular @Input讲解及用法

    1.什么是@input @input的作用是定义模块输入,是用来让父级组件向子组件传递内容. 2.@input用法 首先在子组件中将需要传递给父组件的变量用@input()修饰 需要在子组件ts文件i ...

  8. Shell学习(七)——sort、uniq、cut、wc命令详解

    Shell学习(七)--sort.uniq.cut.wc命令详解 转自:[1]linux sort,uniq,cut,wc命令详解 https://www.cnblogs.com/ggjucheng/ ...

  9. Function overloading and return type

    In C++ and Java, functions can not be overloaded if they differ only in the return type. For example ...

  10. @Order注解使用

    注解@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响: @ ...