二分查找是一种非常常见的算法,在面试时会经常被问到。其输入是一个有序的数组,输出需要查找数字的下标(注意输入一定是有序的)。

先说一下最基本的,有序数组中没有重复的元素。

public  class  binarySearchTest {public static void main(String[] args) {int[]num=new int[]{1,4,6,7,9,10,14,18,19,27,30};///初始数组一定是有序的int key=27;System.out.println("初始数组为:");for(int i=0;i<num.length;i++){System.out.print(num[i]+" ");}System.out.println();System.out.println("要查找的数字:"+key);binarySearch(num,key);}
public static int binarySearch(int[]num,int key)
{int left=0;int right=num.length-1;///这里一定要注意是left<=rightwhile(left<=right){int middle=(left+right)/2;System.out.println("left="+num[left]+"  right="+num[right]+"   middle="+num[middle]);if (num[middle] == key) {System.out.println("查找成功");return middle;}else if(num[middle]<key){left=middle+1;}else{right=middle-1;}}System.out.println("查找失败");return -1;
}}


接着说一下二分查找的变种,比如说对于一个有序数组中,可以存在重复的元素。

查找第一个与key相同的数字的下标

public  class  binarySearchTest {public static void main(String[] args) {int[]num=new int[]{1,4,4,4,6,7,9,10,14,18,19,27,30};///初始数组一定是有序的int key=4;System.out.println("初始数组为:");for(int i=0;i<num.length;i++){System.out.print(num[i]+" ");}System.out.println();System.out.println("要查找的数字:"+key);binarySearch(num,key);}
public static int binarySearch(int[]num,int key)
{int left=0;int right=num.length-1;///这里一定要注意是left<=rightwhile(left<=right){int middle=(left+right)/2;System.out.println("left="+num[left]+"  right="+num[right]+"   middle="+num[middle]);if(num[middle]>=key){right=middle-1;}else{left=middle+1;}}System.out.println("最后一次查询: "+"left="+num[left]+"  right="+num[right]);//这里需要判断一下num[left]是否等于keyif(left<num.length&&num[left]==key){System.out.println("查找成功");return left;}System.out.println("查找失败");return -1;
}}

查找最后一个与key相等数字的下标

public  class  binarySearchTest {public static void main(String[] args) {int[]num=new int[]{1,4,6,7,9,10,10,10,10,14,18,19,27,30};///初始数组一定是有序的int key=10;System.out.println("初始数组为:");for(int i=0;i<num.length;i++){System.out.print(num[i]+" ");}System.out.println();System.out.println("要查找的数字:"+key);binarySearch(num,key);}
public static int binarySearch(int[]num,int key)
{int left=0;int right=num.length-1;///这里一定要注意是left<=rightwhile(left<=right){int middle=(left+right)/2;System.out.println("left="+num[left]+"  right="+num[right]+"   middle="+num[middle]);if(num[middle]>key){right=middle-1;}else{left=middle+1;}}System.out.println("最后一次查询: "+"left="+num[left]+"  right="+num[right]);//这里需要判断一下num[left]是否等于keyif(right>=0&&num[right]==key){System.out.println("查找成功");return right;}System.out.println("查找失败");return -1;
}}


咱们接着说一下另外几种变种

查找第一个大于key的数字的下标

public  class  binarySearchTest {public static void main(String[] args) {int[]num=new int[]{1,4,4,4,6,7,9,10,14,18,19,27,30};///初始数组一定是有序的int key=4;System.out.println("初始数组为:");for(int i=0;i<num.length;i++){System.out.print(num[i]+" ");}System.out.println();System.out.println("要查找第一个大于:"+key+"的数字");binarySearch(num,key);}public static int binarySearch(int[]num,int key){int left=0;int right=num.length-1;///这里一定要注意是left<=rightwhile(left<=right){int middle=(left+right)/2;System.out.println("left="+num[left]+"  right="+num[right]+"   middle="+num[middle]);if(num[middle]>key){right=middle-1;}else{left=middle+1;}}System.out.println("最后一次查询: "+"left="+num[left]+"  right="+num[right]);//这里需要判断一下left是否小于num.lengthif(left<num.length){System.out.println("查找成功");return left;}System.out.println("查找失败");return -1;}}

查找最后一个小于key的数字的下标

public  class  binarySearchTest {public static void main(String[] args) {int[]num=new int[]{1,4,4,4,6,7,9,10,14,18,19,27,30};///初始数组一定是有序的int key=18;System.out.println("初始数组为:");for(int i=0;i<num.length;i++){System.out.print(num[i]+" ");}System.out.println();System.out.println("要查找最后一个小于:"+key+"的数字");binarySearch(num,key);}public static int binarySearch(int[]num,int key){int left=0;int right=num.length-1;///这里一定要注意是left<=rightwhile(left<=right){int middle=(left+right)/2;System.out.println("left="+num[left]+"  right="+num[right]+"   middle="+num[middle]);if(num[middle]>=key){right=middle-1;}else{left=middle+1;}}System.out.println("最后一次查询: "+"left="+num[left]+"  right="+num[right]);//这里需要判断一下right是否大于等于0if(right>=0){System.out.println("查找成功");return right;}System.out.println("查找失败");return -1;}}


最后两种变种

查找第一个等于或者大于key数字的下标

public  class  binarySearchTest {public static void main(String[] args) {int[]num=new int[]{1,4,4,4,6,7,9,10,14,18,19,27,30};///初始数组一定是有序的int key=8;System.out.println("初始数组为:");for(int i=0;i<num.length;i++){System.out.print(num[i]+" ");}System.out.println();System.out.println("要查找第一个等于或者大于:"+key+"的数字");binarySearch(num,key);}public static int binarySearch(int[]num,int key){int left=0;int right=num.length-1;///这里一定要注意是left<=rightwhile(left<=right){int middle=(left+right)/2;System.out.println("left="+num[left]+"  right="+num[right]+"   middle="+num[middle]);if(num[middle]>=key){right=middle-1;}else{left=middle+1;}}System.out.println("最后一次查询: "+"left="+num[left]+"  right="+num[right]);//这里需要判断一下if(left<=num.length){System.out.println("查找成功");return left;}System.out.println("查找失败");return -1;}}

查找最后一个小于或等于key数字的下标

public  class  binarySearchTest {public static void main(String[] args) {int[]num=new int[]{1,4,4,4,6,7,9,10,14,18,19,27,30};///初始数组一定是有序的int key=8;System.out.println("初始数组为:");for(int i=0;i<num.length;i++){System.out.print(num[i]+" ");}System.out.println();System.out.println("要查找最后一个小于或等于:"+key+"的数字");binarySearch(num,key);}public static int binarySearch(int[]num,int key){int left=0;int right=num.length-1;///这里一定要注意是left<=rightwhile(left<=right){int middle=(left+right)/2;System.out.println("left="+num[left]+"  right="+num[right]+"   middle="+num[middle]);if(num[middle]>key){right=middle-1;}else{left=middle+1;}}System.out.println("最后一次查询: "+"left="+num[left]+"  right="+num[right]);//这里需要判断一下if(right>=0){System.out.println("查找成功");return right;}System.out.println("查找失败");return -1;}}

二分查找的变化还是被较多的,但原理基本上都一样。掌握最基本的一种后,对于其他的,再写的时候要好好想一下他们的判断条件和边界。总之二分查找是我们最因该掌握的一种查找算法。

今天会是有offer的一天么:面试时你真的会写二分查找么相关推荐

  1. “为了拿下 Offer,我在技术面试时迎合面试官,给了错误答案!”

    整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 经历过找工作的人都知道,面试表现对最终结果有着极大的影响力. 在自身条件与竞争者不相上下甚至稍弱的情况下,只要面试过程表现出色,就极大可 ...

  2. leetcode剑指 Offer 53 - II. 0~n-1中缺失的数字(二分查找)

    一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字. 示例 1: 输入: [0,1,3 ...

  3. 拿到淘宝offer后的胡思乱想plus面试总结

    没想到能拿到淘宝的实习offer,心里还是很激动的. 大三以后就忙着找实习,参加了SAP和淘宝的校招,呵呵,还好,第二次就拿到了offer,剩下还有腾讯和百度的招聘,决定去看看,但是还是要走淘宝.这是 ...

  4. 剑指Offer #06 旋转数组的最小数字(二分查找)| 图文详解

    题目来源:牛客网-剑指Offer专题 题目地址:旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小 ...

  5. 获得北大新材料学院夏令营offer的艰险历程(附面试答辩PPT)

    知乎原文 获得北大新材料学院夏令营offer的艰难历程(附面试答辩PPT) - 知乎 视频版 05:27 获得北大新材料学院夏令营offer的艰险历程 科大云炬 的视频 · 698 播放 文字版 相继 ...

  6. 15年手持4个大厂offer的我,今天面试今日头条体无完肤

    1)先讲自己面试前的工作状况 ​ 我在11年进入的Android 行业,没错我是转行的.本科是机械电子专业,大学就开了一堂C语言的课程,而且,这个课程基本上早就还给老师了.现在想来,我那时真的生活在一 ...

  7. 十大面试问题解惑,秒杀一切HR、技术面试。程序员必读! 最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余。小编收集了10个面试官最爱提的问题

    十大面试问题解惑,秒杀一切HR.技术面试.程序员必读! 最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余.小编收集了10个面试官最爱提的问题 ...

  8. 成功斩获腾讯offer,分享我的面试经历(附书籍推荐)

    秋招运气比较好,拿到百度.阿里.腾讯.华为.360.美团.小米的(准)offer,不过都是意向书....非正式.攒波人品,等之后的结果吧. 本人本科211,硕士末流985.实力很渣,实验室项目也不行. ...

  9. 我发现凡是给offer的公司,面试时基本不问技术细节,那些问得又多又细的公司,后面就没下文了!...

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 2.8 分钟. 来自:公子龙 来谈一个话题,愿意给 offer 的公司,在面试过程中会扣着细节一点点问,还是随便聊聊就行. 有 ...

最新文章

  1. 美国雷神公司对第六代战斗机的任务系统提出六点预测
  2. c#中调用Excel
  3. ARM/THUMB汇编(补丁开发类)基础教程
  4. Python将PDF文件转换成PNG的方案
  5. 记录kafka-flink bug
  6. 【Linux网络编程学习】使用socket实现简单服务器——多进程多线程版本
  7. Qt工作笔记-QByteArray与自定义结构体之间的转化(可用于网络传输,以及数据回调)
  8. LeetCode 47. Permutations II
  9. 关于php变量的赋值和引用的区别
  10. php tr td,php-基于tr计数的Td / th的XPath
  11. [SPOJ CIRU]The area of the union of circles(自适应Simpson积分求圆并面积)
  12. html 中英文字体自动调节,网页CSS字体/网页常用中英文字体(带字体预览)
  13. php微信提现到零钱,PHP实现微信提现(企业付款到零钱)
  14. SuperMap 三维产品白皮书
  15. c语言oj中的wa是什么意思,杭电oj1002题一直是WA ,然而格式什么的都对啊?求教OAO...
  16. kali 安装volatility_Linux下内存取证工具Volatility的使用
  17. pytorch训练FER2013模型
  18. N维数组( ndarray)
  19. 【断章取义】闹阴司司马貌断狱
  20. 从小白到web渗透工程师——零基础指南(2)sql注入漏洞

热门文章

  1. AFL++ (PlusPlus) 介绍与实践
  2. BI 前端实践 4:自定义多维分析界面
  3. 三星530换固态硬盘_【双.11攻略】爱生活 移动硬盘能给生活带来哪些改变?_三星固态硬盘_游戏硬件存储...
  4. 悲剧了 花一千多买的三星的固态硬盘 突然无法访问了,用了这个命令好呆又能访问了
  5. CGAN论文解读:Conditional Generative Adversarial Nets
  6. 加快区块链建设!这所一流大学成立了实验室
  7. 湖北科技职业学院计算机专业代码,志愿填报:普通文理类专业代码
  8. 菌体浓度测定方法/细菌计数方法
  9. rda分析怎么做_R语言做冗余分析(RDA)的一个简单小例子
  10. relativelayout设置边框_Android TableLayout 增加边框,以及圆角的实现方式