一道简单的面试题:竟然有90%的程序员不能把这个算法完全写出来

程序员洞察报告:90后占比过半 搜索算法等岗位人才短缺 互联网时代,程序员一直是备受关注的群体。近日,前程无忧发布的《2021程序员群体洞察报告》(以下简称“报告”)显示,90后程序员占比已过半,女性程序员的占比也在逐年同比提升,国内程序员薪资均值处于各行业各职能的相对较高位。尽管Python开发、Web前端供需两旺,但仍存在相关人才短缺的问题。 年轻化、高学历成从业群体特征 有数据显示,预计到2023年底,全球软件开发人员将达到2770万,其中增长最快的国家是中国(到2023年将占6%至8%)。其中,90后已经成为程序员群体的主力。报告数据也显示,22-29 阅读详情

前段时间,在论坛上看到有统计说有90%的程序员不能够写对简单的二分法。二分法不是很简单的吗? 这难道不是耸人听闻?

其实,二分法真的不那么简单,尤其是二分法的各个变种。 最最简单的二分法,就是从一个排好序的数组之查找一个key值。 如下面的程序。

/**
 * 二分查找,找到该值在数组中的下标,否则为-1
 */
static int binarySerach(int[] array, int key) {
 int left = 0;
 int right = array.length - 1;
 // 这里必须是 <=
 while (left <= right) {
 int mid = (left + right) / 2;
 if (array[mid] == key) {
 return mid;
 }
 else if (array[mid] < key) {
 left = mid + 1;
 }
 else {
 right = mid - 1;
 }
 }
 return -1;
}

这个程序,相信只要是一个合格的程序员应该都会写。 稍微注意一点, 每次移动left和right指针的时候,需要在mid的基础上+1或者-1, 防止出现死循环, 程序也就能够正确的运行。

但如果条件稍微变化一下, 你还会写吗?如,数组之中的数据可能可以重复,要求返回匹配的数据的最小(或最大)的下标;更近一步, 需要找出数组中第一个大于key的元素(也就是最小的大于key的元素的)下标,等等。 这些,虽然只有一点点的变化,实现的时候确实要更加的细心。 下面列出了这些二分检索变种的实现。

1、找出第一个与key相等的元素

// 查找第一个相等的元素
static int findFirstEqual(int[] array, int key) {
 int left = 0;
 int right = array.length - 1;
 // 这里必须是 <=
 while (left <= right) {
 int mid = (left + right) / 2;
 if (array[mid] >= key) {
 right = mid - 1;
 }
 else {
 left = mid + 1;
 }
 }
 if (left < array.length && array[left] == key) {
 return left;
 }

 return -1;
}

2、找出最后一个与key相等的元素

// 查找最后一个相等的元素
static int findLastEqual(int[] array, int key) {
 int left = 0;
 int right = array.length - 1;
 // 这里必须是 <=
 while (left <= right) {
 int mid = (left + right) / 2;
 if (array[mid] <= key) {
 left = mid + 1;
 }
 else {
 right = mid - 1;
 }
 }
 if (right >= 0 && array[right] == key) {
 return right;
 }
 return -1;
}

3、查找第一个等于或者大于Key的元素

// 查找第一个等于或者大于key的元素
static int findFirstEqualLarger(int[] array, int key) {
 int left = 0;
 int right = array.length - 1;
 // 这里必须是 <=
 while (left <= right) {
 int mid = (left + right) / 2;
 if (array[mid] >= key) {
 right = mid - 1;
 }
 else {
 left = mid + 1;
 }
 }
 return left;
}

4、查找第一个大于key的元素

// 查找第一个大于key的元素
static int findFirstLarger(int[] array, int key) {
 int left = 0;
 int right = array.length - 1;
 // 这里必须是 <=
 while (left <= right) {
 int mid = (left + right) / 2;
 if (array[mid] > key) {
 right = mid - 1;
 }
 else {
 left = mid + 1;
 }
 }
 return left;
}

5、查找最后一个等于或者小于key的元素

// 查找最后一个等于或者小于key的元素
static int findLastEqualSmaller(int[] array, int key) {
 int left = 0;
 int right = array.length - 1;
 // 这里必须是 <=
 while (left <= right) {
 int mid = (left + right) / 2;
 if (array[mid] > key) {
 right = mid - 1;
 }
 else {
 left = mid + 1;
 }
 }
 return right;
}

6、查找最后一个小于key的元素

// 查找最后一个小于key的元素
static int findLastSmaller(int[] array, int key) {
 int left = 0;
 int right = array.length - 1;
 // 这里必须是 <=
 while (left <= right) {
 int mid = (left + right) / 2;
 if (array[mid] >= key) {
 right = mid - 1;
 }
 else {
 left = mid + 1;
 }
 }
 return right;
}

接下来,大家可以对这四种变种算法进行相应的测试。

很多的时候,应用二分检索的地方都不是直接的查找和key相等的元素,而是使用上面提到的二分检索的各个变种,熟练掌握了这些变种,当你再次使用二分检索的检索的时候就会感觉的更加的得心应手了。

针对于上面的文章我总结出了互联网公司java程序员面试涉及到的绝大部分面试题及答案做成了文档和架构视频资料(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

一个90%程序员写不对的算法——二分查找 一个90%的程序员写不对的程序,一个面试高频出现的面试题,一个开发中用之甚广的算法,一个最能体现程序员素质的代码,它就是二分查找。 阅读详情

相关推荐

Figma入门-自动布局

Figma原型图制作内置组件友好,自动布局类似CSS flex,通过布局网格控制对齐、分布、换行等,前端熟悉的同学易上手,参数设置基本一致。

我码玄黄的博客 2175

算法面试题:你都工作三年了,怎么就是记不住我?

前言 金三银四,又到了换工作的最佳时机,我幻想着只要跳个槽,就能离开这个”鸟地方“,拿着更多的钱,干着最爽的事… 然而现实总是残酷的,最近有个朋友在换工作,面试前什么手写Priomise、vue双向绑定原理,webpack优化方式,准备了一大堆,本以为成竹在胸,结果却在算法上吃了大亏,心仪的offer没有拿到,一度怀疑人生。到底是什么算法题能让面试官对妹子说出你都工作3年了,这个算法题都不会?这样的狠话? 有效的括号问题 这是一道leetcode上的原题,本意是在考察候选人对栈数据结构的掌握。来看

m0_69519298的博客 619

激光三角测量法:斜射与直射式技术的原理与应用解析

本文深入解析激光三角测量法中斜射式与直射式技术的原理、应用及对比。斜射式适用于高精度小范围测量,尤其擅长处理反光表面;直射式则适合大范围位移检测,结构更简单。文章详细介绍了两种技术的光路分析、数学建模、应用场景及选型建议,并探讨了系统校准与误差分析方法,为工业检测领域提供实用参考。

weixin_29280219的博客 414

二分法的变种

其实,二分法真的不那么简单,尤其是二分法的各个变种。 最最简单的二分法,就是从一个排好序的数组之查找一个key值。 如下面的程序: int search(int *arr, int n, int key) { int left = 0, right = n-1; while(left&lt;=right) { int mid = left + ((right ...

coolwriter的博客 561

机械臂速成小指南(八):标准DH法实战——从连杆坐标系到运动学方程

本文详细介绍了机械臂运动学建模中的标准DH法,从连杆坐标系的建立到运动学方程的求解,提供了实用的操作步骤和代码示例。通过DH参数表和变换矩阵的构建,帮助读者快速掌握机械臂运动学建模的核心技术,并解决实际应用中的常见问题。

oo7890的博客 211

基于YOLOv5的隧道衬砌缺陷智能检测系统

计算机视觉在工程检测领域正发挥越来越重要的作用,特别是目标检测技术通过深度学习算法实现了对复杂场景的智能分析。YOLOv5作为当前主流的目标检测框架,通过改进网络结构和训练策略,可以显著提升检测精度和效率。在隧道工程领域,结合通道注意力机制和多尺度特征融合技术,能够有效解决衬砌缺陷识别中的小目标检测难题。这种AI检测系统相比传统人工判读地质雷达图像,不仅将效率提升20倍,还能将识别准确率提高到92.3%,特别适用于3cm以上结构缺陷的自动化检测。系统通过深度可分离卷积等优化,实现了模型轻量化,便于在边缘计算

weixin_29064103的博客 326

二分法变种及Java实现

其核心思想是通过将目标数据与有序的数据序列进行比较,每次查找都将数据序列一分为二,确定目标数据在哪一半中,直到找到目标数据或者确定目标数据不存在。本文将介绍几种常见的二分法变种,并给出Java实现。本文介绍了三种常见的二分法变种:查找第一个等于给定值的元素、查找最后一个等于给定值的元素和查找插入位置,并给出了相应的Java实现。当找到目标元素时,我们并不立即返回,而是继续向左查找,直到找到第一个等于目标值的元素。当找到目标元素时,我们并不立即返回,而是继续向右查找,直到找到最后一个等于目标值的元素。

一叶浮萍归大海的博客 604

MS建模mmt

一、流程:1.定义好每个原子力场类型:Edit Sets(分组) 2.加H(一般是仅与Al-O八面体中的Al相连的O原子)、给H分组 3.“make P1”、校核化学式(正确与否) 4.扩成超晶胞(Na-mmt:4*1*1,Ca-mmt:4*2*1,illite:2*1*1,由化学式而定) 5.置换阳离子: mmt:模型中每 32 个 Si 4+有 1 个被 Al 3+ 取...

weixin_30721899的博客 2174

二分查找及其变种

2. while (left < = right),注意括号内为 left <= right ,而不是 left < right ,如果我们设置条件为 left < right 则当我们执行到最后一步时,则我们的 left 和 right 重叠时,则会跳出循环,返回 -1,区间内不存在该元素,但是不是这样的,我们的 left 和 right 此时指向的就是我们的目标元素 ,但是此时 left = right 跳出循环。其基本思想是将目标值与数组中间的元素进行比较,如果目标值等于中间元素,则查找成功;

weixin_47027760的博客 1160

大数据预测分析:精准把握市场趋势

传统市场预测多依赖经验判断(比如“去年卖了1000件,今年加20%”)或小数据统计(比如用近6个月的销量做线性回归)。而大数据预测分析是:利用海量结构化+非结构化数据(销售、用户、社交媒体、天气等),通过机器学习/深度学习模型,挖掘数据中的关联关系与趋势规律,实现对未来市场走势的精准预测。更全面:覆盖内部(企业数据)+外部(行业、环境数据)的全维度数据;更精准:用算法替代人工,避免主观偏差;更实时:支持分钟级/小时级的实时预测(比如直播带货的销量预测)。错误做法。

AI智能探索者的博客 1024

使用libVLC进行视频截图的C/C++实现

通过这些代码,你可以在C/C++应用程序中实现视频截图功能,并将视频帧保存为图像文件。请注意,本文只提供了基本的示例代码,你可以根据自己的需求进行扩展和修改。libVLC是一个强大的开源多媒体框架,可以用于在C/C++应用程序中处理和播放音频和视频文件。我们将展示如何初始化libVLC,打开视频文件,捕获视频帧并保存为图像文件。在开始编写代码之前,你需要包含libVLC的头文件,并链接相应的库文件。在链接阶段,你需要添加libVLC库的链接选项。在使用libVLC之前,你需要初始化libVLC的实例。

学习使你进步。 471

算法之二分法查找及其变种

二分查找就是将查找的键和子数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找;如果大于中间键,就在右子数组中查找,否则中间键就是要找的元素。 一、二分法查找 /** * 二分法查找,前提:数组必须先排好序 * * @param arrs * @param target * @return */ public static int binarySearch(in...

Rogera的博客 1135

QGis软件 —— 1、Windows10下载安装QGis及插件

QGis —— 1、Windows10下载安装QGis及插件

5159

一道简单的面试题:竟然有90%的程序员不能把这个算法完全写正确。。。

前段时间,在论坛上看到有统计说有90%的程序员不能够写对简单的二分法。二分法不是很简单的吗? 这难道不是耸人听闻? 其实,二分法真的不那么简单,尤其是二分法的各个变种。 最最简单的二分法,就是从一个排好序的数组之查找一个key值。 如下面的程序。 /** * 二分查找,找到该值在数组中的下标,否则为-1 */ static int binarySerach(int[] array, in...

240

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java面试题一道,据说90%的程序员答不上来

题目规律 需要打印出的结果中数字存在下面这样的规律: 1、平等四边形中心对称。 2、中心列是1,3,5,7,9 3、右边的三角形中的数字等于左侧数字+左上角的数字之和。 4、数字要排整齐,需要用空格补齐较小的数字。 解题步骤 1、定义二维数组。 2、给中心列赋值。 3、从中心列开始向两侧依次计算。 4、打印数组。 public static void main(String[] args) ...

老姚 2066

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

记一道超级简单的算法面试题,90%的人没能完整答出来

程序员的成长之路互联网/程序员/成长/职场关注阅读本文大概需要 3.5 分钟。来自:https://zhuanlan.zhihu.com/p/57859872这可能是历史上最简单的一道...

良月柒 568

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

面试题:竟然有90%的程序员不能把这个算法完全写正确。。。

前几天,在论坛上看到有统计说有90%的程序员不能够写对简单的二分法。二分法不是很简单的吗? 这难道不是耸人听闻? 学习Python中的小伙伴,需要学习资料的话,可以前往我的微信公众号:速学Python,后台回复:cadn,即可拿Python学习资料 这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。送给...

Python_1_3的博客 443

这些Java面试题,竟然90%的公司都会问到!

前言: 马上就快到金九银十了,这可是程序员们跳槽,升值,涨薪,走上人生顶峰的好时刻,对于这个可能是你人生的重要转折点之一,相信现在就有好多朋友在为这个黄金时段做好准备了,错过了金三银四,可不能错过金九银十呀。 再加上今年多灾多难的一年,相信今年的黄金期肯定会有大爆发。所以在这为大家精心准备了常问的面试题,祝大家一路过关斩将,成功拿到offer。 由于时间原因答案我就不写了,需要答案的可以点击下方群号自行领取。另外本人整理收藏了20年多家公司面试知识点整理 ,以及各种Java核心知识点免费分享给大家,我认为

banzhuanhu的博客 5849

悲哀!面试现场,简单几道java算法题,90%程序员没写出来

这两天小编逛论坛的时候发现一个很有意思的事情,就是一位互联网公司的面试官分享的,他们最近想招一批java的实习生,所以他们的面试题并不难,但是前来面试的人,却很多都挂在了几道算法题上,要么就是逻辑不严谨,要么就是题目都看不懂的,还有就是书写错误的,这让他感到很诧异,毕竟算法其实对于程序员来讲应该是很基础的却必须掌握的能力,只能说现在的java学习者对于基础的学习并不是很严谨,在这里我也把这几道算法...

weixin_34183910的博客 1505

90%的Java程序员都踩过的内存坑,你还敢说自己稳了吗?

别急!今天这篇就带你✍大家好,我是默语,别名默语博主,擅长的技术领域包括Java、运维和人工智能。我的技术背景扎实,涵盖了从后端开发到前端框架的各个方面,特别是在Java 性能优化、多线程编程、算法优化等领域有深厚造诣。目前,我活跃在优快云、掘金、阿里云和 51CTO等平台,全网拥有超过15万的粉丝,总阅读量超过1400 万。统一 IP 名称为默语或者默语博主。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 1万+

【转型必备】当AI能写90%的代码:2035年前程序员的生存策略与方向选择,建议立即收藏!

摘要:文章预测程序员岗位将在2035年前被AI逐步取代,产品经理需掌握prompt工程,架构师需亲自参与代码实现。未来企业组织结构将简化,减少程序员岗位,增加AI投入。建议程序员学习prompt技巧、提升代码优化能力,并考虑转型产品或架构方向。同时提供了大模型学习资源,强调持续学习以适应AI时代的技术变革。(149字)

优快云_430422的博客 955

程序员必考:Java技术栈面试题,覆盖90%题型

Java作为企业级开发的主流语言,在面试中考察范围广泛。本文系统梳理了Java技术栈的核心知识点:基础部分涵盖语言特性、集合框架、并发编程和JVM原理;框架与中间件重点解析Spring生态、数据库优化、缓存和消息队列;系统架构部分探讨网络编程、设计模式和性能优化;最后提供面试准备建议,包括学习路径设计、项目展示技巧和职业规划。内容全面覆盖Java开发者的技术能力要求,适合中高级开发者系统复习和面试准备。

m0_73692704的博客 1371

一道简单的面试题,据说90%人不能在30分钟内做出来

不知道是不是我引起的话题,老赵出了个O1的面试题。 // Please write an sequence list implements the interface with the required // time complexity described in the comments. The users can add the same // element as ma...

weixin_33726318的博客 149

惊!面试现场,简单几道java算法题,90%程序员没写出来

近几个月很多大学实习生离校找实习工作去了,本以为自己很值钱,实际上发现自己并不值钱,想象着自己能赚很多钱了,结果只能拿到一点微薄的工资,很多人会怪公司给的少,但是你有没有想过,你自己的技术值多少钱?你学到的这些知识能给公司能创造多少价值?我想说,付出与回报是成正比的,如果你能给公司创造很多的价值,那公司也不会亏待你。 胖胖逛论坛的时候还发现一个很有意思的事情,就是一位互联网公司的面试官分享的,他们...

weixin_44040460的博客 1736
上一篇: Java 面试 1 小时,心态崩溃,分享面试经历
下一篇: Java程序员两次美团面试失败后,只剩心累和干货
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值