今天会是有offer的一天么:面试时你真的会写二分查找么
二分查找是一种非常常见的算法,在面试时会经常被问到。其输入是一个有序的数组,输出需要查找数字的下标(注意输入一定是有序的)。
先说一下最基本的,有序数组中没有重复的元素。
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的一天么:面试时你真的会写二分查找么相关推荐
- “为了拿下 Offer,我在技术面试时迎合面试官,给了错误答案!”
整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 经历过找工作的人都知道,面试表现对最终结果有着极大的影响力. 在自身条件与竞争者不相上下甚至稍弱的情况下,只要面试过程表现出色,就极大可 ...
- leetcode剑指 Offer 53 - II. 0~n-1中缺失的数字(二分查找)
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字. 示例 1: 输入: [0,1,3 ...
- 拿到淘宝offer后的胡思乱想plus面试总结
没想到能拿到淘宝的实习offer,心里还是很激动的. 大三以后就忙着找实习,参加了SAP和淘宝的校招,呵呵,还好,第二次就拿到了offer,剩下还有腾讯和百度的招聘,决定去看看,但是还是要走淘宝.这是 ...
- 剑指Offer #06 旋转数组的最小数字(二分查找)| 图文详解
题目来源:牛客网-剑指Offer专题 题目地址:旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小 ...
- 获得北大新材料学院夏令营offer的艰险历程(附面试答辩PPT)
知乎原文 获得北大新材料学院夏令营offer的艰难历程(附面试答辩PPT) - 知乎 视频版 05:27 获得北大新材料学院夏令营offer的艰险历程 科大云炬 的视频 · 698 播放 文字版 相继 ...
- 15年手持4个大厂offer的我,今天面试今日头条体无完肤
1)先讲自己面试前的工作状况 我在11年进入的Android 行业,没错我是转行的.本科是机械电子专业,大学就开了一堂C语言的课程,而且,这个课程基本上早就还给老师了.现在想来,我那时真的生活在一 ...
- 十大面试问题解惑,秒杀一切HR、技术面试。程序员必读! 最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余。小编收集了10个面试官最爱提的问题
十大面试问题解惑,秒杀一切HR.技术面试.程序员必读! 最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余.小编收集了10个面试官最爱提的问题 ...
- 成功斩获腾讯offer,分享我的面试经历(附书籍推荐)
秋招运气比较好,拿到百度.阿里.腾讯.华为.360.美团.小米的(准)offer,不过都是意向书....非正式.攒波人品,等之后的结果吧. 本人本科211,硕士末流985.实力很渣,实验室项目也不行. ...
- 我发现凡是给offer的公司,面试时基本不问技术细节,那些问得又多又细的公司,后面就没下文了!...
程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 2.8 分钟. 来自:公子龙 来谈一个话题,愿意给 offer 的公司,在面试过程中会扣着细节一点点问,还是随便聊聊就行. 有 ...
最新文章
- 美国雷神公司对第六代战斗机的任务系统提出六点预测
- c#中调用Excel
- ARM/THUMB汇编(补丁开发类)基础教程
- Python将PDF文件转换成PNG的方案
- 记录kafka-flink bug
- 【Linux网络编程学习】使用socket实现简单服务器——多进程多线程版本
- Qt工作笔记-QByteArray与自定义结构体之间的转化(可用于网络传输,以及数据回调)
- LeetCode 47. Permutations II
- 关于php变量的赋值和引用的区别
- php tr td,php-基于tr计数的Td / th的XPath
- [SPOJ CIRU]The area of the union of circles(自适应Simpson积分求圆并面积)
- html 中英文字体自动调节,网页CSS字体/网页常用中英文字体(带字体预览)
- php微信提现到零钱,PHP实现微信提现(企业付款到零钱)
- SuperMap 三维产品白皮书
- c语言oj中的wa是什么意思,杭电oj1002题一直是WA ,然而格式什么的都对啊?求教OAO...
- kali 安装volatility_Linux下内存取证工具Volatility的使用
- pytorch训练FER2013模型
- N维数组( ndarray)
- 【断章取义】闹阴司司马貌断狱
- 从小白到web渗透工程师——零基础指南(2)sql注入漏洞
热门文章
- AFL++ (PlusPlus) 介绍与实践
- BI 前端实践 4:自定义多维分析界面
- 三星530换固态硬盘_【双.11攻略】爱生活 移动硬盘能给生活带来哪些改变?_三星固态硬盘_游戏硬件存储...
- 悲剧了 花一千多买的三星的固态硬盘 突然无法访问了,用了这个命令好呆又能访问了
- CGAN论文解读:Conditional Generative Adversarial Nets
- 加快区块链建设!这所一流大学成立了实验室
- 湖北科技职业学院计算机专业代码,志愿填报:普通文理类专业代码
- 菌体浓度测定方法/细菌计数方法
- rda分析怎么做_R语言做冗余分析(RDA)的一个简单小例子
- relativelayout设置边框_Android TableLayout 增加边框,以及圆角的实现方式