二分查找算法的实现以及解决整数溢出问题

news2025/1/17 22:03:20

前言

  从今天起我会开启一个专栏:Java面试八股文,记录一下我在网上学到的Java面试常考的一些内容,注意:本人暂无面试经验,只是在网上找视频学习到的❗❗❗

二分查找

  我们首先要学习的是二分查找,我相信很多人跟我一样,在看到这四个字的时候会想,这不是刚学Java的时候已经学习过了吗,但是本篇文章会告诉你面试的时候二分查找会出哪些题型,以及也会讲到我之前没有注意过的整数溢出的问题 💪💪。

  首先,什么是二分查找呢,顾名思义,肯定跟二分有关系,也可以叫它折半查找,存储结构采用的是有序数组,首先记录数组第一个元素的位置和数组最后一个元素的位置,然后相加除以2,找到中间元素的位置,然后和你需要查找的元素比较,如果比你要查找的元素小,那么记录第一个元素的位置不变,将记录最后一个元素的位置变为记录中间位置减一的位置,如果比你要查找的元素大,那么记录最后一个元素的位置不变,将记录第一个元素的位置变为记录中间元素位置加一的这个位置,然后继续相加除以2,以此类推,直到找到你想要查找的元素或者找完了找不到为止,因为它每次查找是舍去一半的,所以叫二分查找或者折半查找,接下来我们来看看代码如何实现的👇👇。

public class Main {
    public static void main(String[] args) {
        int [] a ={1,2,3,4,5,6,7,8,9};
        int target = 6;
        int index = binarySearch(a, target);
        System.out.println(index);
    }

    public static int binarySearch(int []a,int target){
        int l = 0,r = a.length-1,m;
        while(l <= r){
            m = (l+r)/2;
            if(a[m]==target){
                return m;
            }else if(a[m] > target){
                r = m -1;
            }else{
                l = m + 1;
            }
        }
        return -1;

    }
}

在这里插入图片描述

  那么到这里二分查找就完了吗,当然不是,如果到这里就完了的话,就跟我们之前学的就一样了,我们就没有讲的必要了,我们看代码的12行:m=(l+r)/2,m是int类型的,肯定是有范围的,如果l+r的值过于大,导致结果超过了int类型的最大范围,那么结果必然会出错,接下来我们就要解决这类问题👇👇。

二分查找解决整数溢出问题(方法1)

  首先我们先来演示一下整数溢出的情况,然后在再解决这个问题,我们在代码中定义数组的最后一个元素的位置为Integer.MAX_VALUE-1,那么如果它要查找的元素如果在数组的左半部分,则不会发生溢出现象,如果在数组的右半部分,则必然会发生溢出现象👇👇。

public class Main1 {
    public static void main(String[] args) {

        //1.模拟要找的值在中间值左侧
        int l = 0;
        int r = Integer.MAX_VALUE-1;
        int m =(l+r)/2;
        System.out.println(m);

        //模拟要找的值在中间值右侧,会溢出
        l = m+1;
        m = (l+r)/2;
        System.out.println(m);
    }
}

在这里插入图片描述

  在计算机中在进行基本运算时,是以二进制的方式进行计算的(逢二进一),而最高位代表的是符号位,也就是正负,0代表正,1代表负当数据过大会溢出时,会向符号位进一,就会改变运算的最终结果,如上图第二行数据☝️☝️。

  那我们的第一种解决办法就是通过改变数学表达式,达到在计算的过程中数值较小,不会发生溢出现象的效果:将(l+r)/2进行变换👇👇。

在这里插入图片描述

public class Main1 {
    public static void main(String[] args) {

        //1.模拟要找的值在中间值左侧
        int l = 0;
        int r = Integer.MAX_VALUE-1;
        int m =l+(r-l)/2;
        System.out.println(m);

        //模拟要找的值在中间值右侧
        l = m+1;
        m = l+(r-l)/2;
        System.out.println(m);
    }
}

在这里插入图片描述

二分查找解决整数溢出问题(方法2)

  方法二其实更高效一些,它是通过无符号的右移运算符:>>>代替掉除法运算的,它不光能解决我们的溢出问题,在效率上也是比除法高的👇👇。

public class Main1 {
    public static void main(String[] args) {

        //1.模拟要找的值在中间值左侧
        int l = 0;
        int r = Integer.MAX_VALUE-1;
        int m =(l+r)>>>1;
        System.out.println(m);

        //模拟要找的值在中间值右侧
        l = m+1;
        m = (l+r)>>>1;
        System.out.println(m);
    }
}

在这里插入图片描述

二分查找选择题目

  二分查找面试题一部分是让你手写二分查找代码,上边我们已经讲过,另一部分就是以选择题的形式出现👇👇。

在这里插入图片描述

答案:4次

在这里插入图片描述

答案:4次
注意:如果数组的元素为偶数个时,如果没有特别要求,我们通常选取中间靠左边的元素作为中间元素。

在这里插入图片描述

答案:七次
  解析:可以将上边的问题转化为:2^n=128,求n,或者让128一直除2,向下取整,直到剩下被除数为1为止,统计除以2的次数

总结

  以上就是我们二分查找在面试中的常见题型,一类是手写代码,另一类是选择题,在本文中均已讲到,最后,如果有什么错误的话,大家可以私信我📬📬,希望大家多多关注+点赞+收藏 ^_ ^🙏🙏,你们的鼓励是我不断前进的动力💪💪!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL - text字段

一、text属性 MySQL下的TEXT属性一种特殊的字符串&#xff0c;存储单位为字节&#xff0c;有四种类型 TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT 不同的是可以存储的字符串的长度以及空间占用大小 TINYTEXT最大存放长度为255个字符的字符串 TEXT最大存放长度为65535个字符的…

XlsReadWriteII EXCEL Cell 单元数据读写

XlsReadWriteII EXCEL Cell 单元数据读写 下面从编程的眼光&#xff0c;从XlsReadWriteII的角度&#xff0c;谈谈EXCEL的理解。回顾一下EXCEL发展史&#xff1a; 1982年&#xff1a;微软推出了它的第一款电子表格软件&#xff1a;Multiplan。 1985年&#xff1a;推出了…

Day06 C++STL入门基础知识三——String容器(下)比较-存取-插入-删除-子串获取【全面深度剖析+例题代码展示】

永远相信&#xff0c;美好的事情即将发生&#xff01; 文章目录1. 比较操作1.1 比较方式1.2 函数原型1.3 代码展示2. 字符读写2.1 字符读入/访问2.1.1 方式2.1.2 代码展示2.2 修改字符2.2.1 方式2.2.2 代码展示3. 插入和删除3.1 函数原型3.2 代码展示4. 截取子串(比较实用!!!)4…

蓝桥杯STM32G431RBT6学习——定时器输入捕获

蓝桥杯STM32G431RBT6学习——定时器输入捕获 前言 从省赛的题目来看&#xff0c;对于定时器输入捕获这块几乎不考&#xff0c;但是为了知识的完整性及避免万一&#xff0c;依旧有了解的必要。国信长天开发板上的定时器捕获主要针对于NE555波形发生器的方波进行频率、脉宽等测…

恶意代码分析实战 3 IDA Pro

利用IDA PRO分析Lab05-01.dll 实验目的 利用IDA Pro分析Lab05-01.dll中发现的恶意代码&#xff0c;回答以下问题&#xff1a; DLLMain的地址是什么&#xff1f; 可以空格转入反汇编查看DLLMain地址&#xff0c;或者 DLLMain的地址是.text:0x1000D02E。 使用Imports窗口并浏…

这几个步骤,让你的电脑避免卡顿~

C盘主要是系统运行的存储空间&#xff0c;如果C盘装满了东西&#xff0c;那就意味着电脑的存储空间小&#xff0c;电脑运行就会更慢。&#x1f62f; 另外&#xff0c;桌面上的文件也属于C盘&#xff0c;所以桌面也不要放太多东西。除装机时候的一些必要软件&#xff0c;后期装的…

SpringBoot切换数据源

基本使用添加依赖<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.3.0</version> </dependency>数据源配置spring:datasource:dynamic:primary: fir…

【多元统计分析】Python实现对应分析

&#xff08;一&#xff09;题目要求 数据集包含地区生产总值的四个相关指标&#xff1a;x1劳动者报酬&#xff0c;x2生产税净额&#xff0c;x3固定资产折旧&#xff0c;x4营业盈余。对各个地区生产总值进行对应分析&#xff0c;揭示不同地区的生产总值构成特征。要求&#xf…

对多线程中线程池的理解

一.概念理解何为线程池&#xff1f;线程池的释义正如它的命名&#xff1a;专门用来存放线程的池子&#xff08;集合类&#xff09;&#xff0c;也就是将线程存储于集合类&#xff0c;使用时从线程池中直接获取&#xff0c;使用结束后将线程放回集合类即可&#xff0c;这样就避免…

macOS Ventura 13.2 (22D49) Boot ISO 原版可引导镜像

本站下载的 macOS Ventura 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。 2023 年 1 月 23 日&#xff08;北京时间 24 日凌晨&#xff09;&#xff0c;m…

基于电流型磁链观测器的异步电机矢量控制学习

导读&#xff1a;本期主要介绍电流型磁链观测器&#xff08;current flux observer&#xff09;在不同坐标系下的表现形式&#xff0c;应用在异步电机矢量控制系统中。如需要文中的仿真模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制&#xff0c;获取。一、引言磁链估…

JavaEE day4 初识HTML+总结3

FORM表单的常见type属性 FORM表单的tpye属性非常多&#xff0c;这里只介绍常见的几个&#xff1a; text &#xff1a; 输入普通文本&#xff0c;例如登录注册下的用户名 password &#xff1a; 输入密码文本&#xff0c;例如登录注册下的密码&#xff0c;隐藏用户的输入 ra…

如何使用JDBC操作数据库,JDBC实战案例详细解读

1. 前言 前面 3 篇 JDBC 入门级基础文章中&#xff0c;我们已经探讨了什么是 JDBC&#xff0c;如何使用JDBC 操作数据库&#xff0c;JDBC API 详细解读&#xff0c;以及数据库连接池的基础等。文章带来的反馈还不错&#xff0c;今天我们使用前面学习的内容做一个实战案例训练。…

贪心 135. 分发糖果

135. 分发糖果 难度困难1086 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&…

uboot启动流程简要版(基于armv7)

uboot启动流程&#xff08;armv7&#xff09; uboot介绍 uboot就是一段引导程序&#xff0c;在加载系统内核之前&#xff0c;完成硬件初始化&#xff0c;内存映射&#xff0c;为后续内核的引导提供一个良好的环境。 uboot是bootloader的一种&#xff0c;全称为universal boot…

二叉树基础oj练习

1.单值二叉树 题目: 力扣https://leetcode.cn/problems/univalued-binary-tree/ 思路: 单值二叉树 root和左右孩子的值相等 左子树是单值二叉树 右子树是单值二叉树 代码: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeN…

CSS 艺术之心形-彩虹-加载动画

CSS 艺术之心形-彩虹-加载动画&#xff08;居中抖动问题&#xff09;参考描述效果HTMLCSS重置元素的部分默认样式bodyli动画定义指定animationul居中抖动问题代码总汇参考 项目描述搜索引擎BingMDNMDN Web Docs 描述 项目描述Edge109.0.1518.61 (正式版本) (64 位) 效果 HTML…

【Vue笔记】Vue中默认插槽slot、具名插槽slot、自定义组件的v-model属性的使用

这篇文章&#xff0c;主要介绍Vue中默认插槽slot、具名插槽slot、自定义组件的v-model属性的使用。 目录 一、插槽slot介绍 1.1、默认插槽 1.2、具名插槽 &#xff08;1&#xff09;如何定义具名插槽&#xff1f;&#xff1f;&#xff1f; &#xff08;2&#xff09;如何使…

3DMAX纹理插件BerconMaps使用教程

BerconMaps是3dMax的第三方纹理插件。它添加了五个新的3dMax纹理贴图&#xff1a;噪波&#xff08;Noise&#xff09;、木纹&#xff08;Wood&#xff09;、瓷砖&#xff08;Tile&#xff09;、失真&#xff08;Distortion&#xff09;和渐变&#xff08;Gradient&#xff09;。…

linux配置samba服务

文章目录samba服务第一步&#xff1a;下载samba服务第二步&#xff1a;开启服务&#xff0c;查看服务状态第三步&#xff1a;在文件夹系统查看第四步&#xff1a;设置samba的配置文件第五步&#xff1a;再次去尝试连接linux服务共享修改smab服务的配置设置samba服务的用户名和密…