当前位置: 首页 > news >正文

java输入查找数组中的数_剑指Offer Java版 面试题53:在排序数组中查找数字

题目一:数字在排序数组中出现的次数。

统计一个数字在排序数组中出现的次数。例如,输入排序数组{1, 2, 3, 3, 3, 3, 4, 5}和数字3,由于3在这个数组中出现了4次,因此输出4。

练习地址

参考答案

public class Solution {

public int GetNumberOfK(int[] array, int k) {

if (array == null || array.length == 0) {

return 0;

}

int first = getFirst(array, k, 0, array.length - 1);

int last = getLast(array, k, 0, array.length - 1);

if (first > -1 && last > -1) {

return last - first + 1;

} else {

return 0;

}

}

private int getFirst(int[] array, int k, int start, int end) {

if (start > end) {

return -1;

}

int mid = (start + end) / 2;

if (array[mid] == k) {

if (mid > 0 && array[mid - 1] != k || mid == 0) {

return mid;

} else {

end = mid - 1;

}

} else if (array[mid] > k) {

end = mid - 1;

} else {

start = mid + 1;

}

return getFirst(array, k, start, end);

}

private int getLast(int[] array, int k, int start, int end) {

if (start > end) {

return -1;

}

int mid = (start + end) / 2;

if (array[mid] == k) {

if (mid < array.length - 1 && array[mid + 1] != k || mid == array.length - 1) {

return mid;

} else {

start = mid + 1;

}

} else if (array[mid] > k) {

end = mid - 1;

} else {

start = mid + 1;

}

return getLast(array, k, start, end);

}

}

复杂度分析

时间复杂度:O(logn)。

空间复杂度:O(logn)。

题目二:0~n-1中缺失的数字

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0 ~ n-1之内。在范围0 ~ n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

参考答案

public int getMissingNumber(int[] numbers) {

if (numbers == null || numbers.length == 0) {

return -1;

}

int left = 0, right = numbers.length - 1;

while (left <= right) {

int mid = (left + right) >> 1;

if (numbers[mid] != mid) {

if (mid == 0 || numbers[mid - 1] == mid - 1) {

return mid;

}

right = mid - 1;

} else {

left = mid + 1;

}

}

if (left == numbers.length) {

return left;

}

// 无效的输入,比如数组不是按要求排序的,

// 或者有数字不在0~n-1范围之内

return -1;

}

复杂度分析

时间复杂度:O(logn)。

空间复杂度:O(1)。

题目三:数组中数值和下标相等的元素。

假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数,找出数组中任意一个数值等于其下标的元素。例如,在数组{-3, -1, 1, 3, 5}中,数字3和它的下标相等。

参考答案

public int getNumberSameAsIndex(int[] numbers) {

if (numbers == null || numbers.length == 0) {

return -1;

}

int left = 0, right = numbers.length - 1;

while (left <= right) {

int mid = (left + right) >> 1;

if (numbers[mid] == mid) {

return mid;

} else if (numbers[mid] > mid) {

right = mid - 1;

} else {

left = mid + 1;

}

}

return -1;

}

复杂度分析

时间复杂度:O(logn)。

空间复杂度:O(1)。

相关文章:

  • 插座java适配器模式_Java开发网 - 适配器模式的理解 (我自己写的)
  • java中borderpane_JavaFX BorderPane布局
  • Java如何查行数_如何正确利用Rownum来限制查询所返回的行数?
  • java 3 4_3-4 Java基础第四天
  • php phar 文件使用,PHP如何操作phar文件
  • java使用xpath解析xml,java使用XPath解析xml
  • php脚本防护,PHP的一个EVAL的利用防范
  • php中背景图怎么设置不重复,css怎么让背景图片不重复
  • java标签更改显示,离子选项卡,如何在标签更改上显示微调器?
  • java读写二进制文件 移动指针 seek,《Java大学教程》—第20章 文件处理
  • php权限无需验证的控制器,控制器 · ThinkPHP5权限管理 · 看云
  • 两'参数粒子群matlab,SVM用粒子群优化参数
  • 数据在文本框中显示 php,在文本框中使用php和纯ajax从数据库加载数据
  • 数字信号处理matlab滤波器,数字信号处理matlab滤波器课程设计
  • matlab逆求贝塞尔函数变量值,MATLAB怎么求解有贝塞尔函数的问题,求高手帮帮忙,谢谢...
  • [ JavaScript ] 数据结构与算法 —— 链表
  • Android Volley源码解析
  • centos安装java运行环境jdk+tomcat
  • laravel with 查询列表限制条数
  • Redis中的lru算法实现
  • session共享问题解决方案
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue-cli在webpack的配置文件探究
  • 安装python包到指定虚拟环境
  • 大整数乘法-表格法
  • 观察者模式实现非直接耦合
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 你不可错过的前端面试题(一)
  • 如何胜任知名企业的商业数据分析师?
  • nb
  • k8s使用glusterfs实现动态持久化存储
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • #define 用法
  • $GOPATH/go.mod exists but should not goland
  • (06)金属布线——为半导体注入生命的连接
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (JS基础)String 类型
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (六)c52学习之旅-独立按键
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (四)c52学习之旅-流水LED灯
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)ObjectiveC 深浅拷贝学习
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET连接MongoDB数据库实例教程
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [BetterExplained]书写是为了更好的思考(转载)