02、JS实现:使用二分查找实现两数相除的算法(要求:不使⽤乘法、除法和 mod 运算符)

二分查找实现两数相除的算法

  • Ⅰ、两数相除:
    • 1、题目描述:
    • 2、解题思路:
    • 3、实现代码:
  • Ⅱ、小结:

Ⅰ、两数相除:

1、题目描述:

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使⽤乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
整数除法的结果应当截去(truncate)其⼩数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
示例 1:
输⼊: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333…) = truncate(3) = 3
示例 2:
输⼊: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = truncate(-2.33333…) = -2

提示:
被除数和除数均为 32 位有符号整数。 除数不为 0。 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。

2、解题思路:

思路一:

符合直觉的做法是:减数⼀次⼀次减去被减数,不断更新差,直到差⼩于 0,我们减了多少次,结果就是多少。


// 核心代码:此时的 dividend 是指被除数,divisor 是指除数;
// 最后的返回值 count 表示:在 dividend 内有多少个 divisor;
let acc = divisor;
let count = 0;
while (dividend - acc >= 0) {acc += divisor;count++;
}
return count;

思路二、

思路一的做法简单直观,但是性能却⽐较差;
我们可以采用性能更好的⽅法:使⽤⼆分法来解决,性能有很⼤的提升;
二分法的本质:有序数组查找指定的值;

3、实现代码:

其一、代码为:


const divide = (dividend, divisor) => {if (divisor === 1) return dividend// 这种⽅法很巧妙,即符号相同则为正,不同则为负const isNegative = dividend > 0 !== divisor > 0// 此时利用异或,也能获取数据最后的符号值(即:isNegative 值);//const isNegative = dividend ^ (divisor < 0)// Math.pow(2, 31) 是指:计算 2 的 31 次方;const MAX_INTERGER = Math.pow(2, 31)// Math.abs(dividend) 是指:是计算 dividend 的绝对值(即:是 JavaScript 中的一个内置函数,用于取数的绝对值);const res = helper(Math.abs(dividend), Math.abs(divisor))// overflowif (res > MAX_INTERGER - 1 || res < -1 * MAX_INTERGER) {return MAX_INTERGER - 1}// 此时是:返回最终的结果;return isNegative ? -1 * res : res
}const helper = (dividend, divisor) => {// 若被除数小于等于 0,返回0;if (dividend <= 0) return 0// 若被除数小于除数,返回 0;if (dividend < divisor) return 0// 若除数等于 1,返回除数;if (divisor === 1) return dividend// ⼆分法let acc = 2 * divisorlet count = 1while (dividend - acc > 0) {// acc 一直 2 倍的增加,直到找到二分法的临界值;acc += acc// count 也会跟着 acc 值 2 倍的增加,并记录到二分法的临界值时,已有多少个 divisor 值被整除;count += count}// 直接使⽤位移运算,⽐如acc >> 1会有问题;// Math.floo() 函数:向下取整,即去掉小数部分,取整数部分;// last 代表:减去二分法临界值后剩余的值(即:准备再递归二分法的被除数值);const last = dividend - Math.floor(acc / 2)// 递归二分法的操作(除数不变,被除数更新);// 递归的出口:其一、last 值为负值; 其二、last 值小于 divisor 值;return count + helper(last, divisor)
}divide(86, 4)
执行  divide(86, 4)  函数后代码执行的过程:第一次调用 helper(86,4) 函数:dividend(被除数)                             acc                                    count86                                    4*2=8	                                    186-8=78>0                                8*2=16                                  1*2=286-16=70>0                              16*2=32                                  2*2=486-32=54>0                              32*2=64                                  4*2=886-64=22>0                              64*2=128                                 8*2=1686-128=-42<0                              128                                      16const last = 86 - 128/2(向下取整) = 86-64 = 22return 16 + helper(22,4)第二次调用 helper(22,4) 函数:dividend(被除数)                             acc                                    count22                                    4*2=8	                                    122-8=14>0                                8*2=16                                  1*2=222-16=6>0                               16*2=32                                  2*2=422-32=-10<0                                32                                      4const last = 22 - 32/2(向下取整) = 22-16 = 6return 4 + helper(6,4)第三次调用 helper(6,4) 函数:dividend(被除数)                             acc                                    count6                                     4*2=8	                                    16-8=-2<0                                   8                                       1const last = 6 - 8/2(向下取整) = 6-4 = 2return 1 + helper(2,4)第四次调用 helper(2,4) 函数:return 0注意:此时的 return 值是递归的,递归后最终的返回值为:return 16 + 4 + 1 + 0 = 21

其二、截图为:

在这里插入图片描述

Ⅱ、小结:

其一、哪里有不对或不合适的地方,还请大佬们多多指点和交流!
其二、若有转发或引用本文章内容,请注明本博客地址(直接点击下面 url 跳转) https://blog.csdn.net/weixin_43405300,创作不易,且行且珍惜!
其三、有兴趣的话,可以多多关注这个专栏(Vue(Vue2+Vue3)面试必备专栏)(直接点击下面 url 跳转):https://blog.csdn.net/weixin_43405300/category_11525646.html?spm=1001.2014.3001.5482

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 部署及基础使用

1. Oracle 简介 Oracle Database&#xff0c;又名 Oracle RDBMS&#xff0c;简称 Oracle Oracle系统&#xff0c;即是以Oracle关系数据库为数据存储和管理作为构架基础&#xff0c;构建出的数据库管理系统。是目前最流行的客户/服务器&#xff08;client/server&#xff09;或…

8种Kubernetes集群中Pod处于 Pending状态的故障排除方法

文章目录 一、Pod与容器二、Pod的阶段&#xff08;状态&#xff09;三、Pod 状态故障排除3.1 检查 Pod 事件3.2 检查资源可用性3.3 检查污点和容忍度3.4 检查节点亲和性设置3.5 检查持久卷声明3.6 检查配额和限制3.7 验证 Pod 和容器映像3.8 分析调度程序日志 四、用于排查 Pen…

html中如何让网页禁用右键禁止查看源代码

在网页中&#xff0c;辛辛苦苦写的文章&#xff0c;被别人复制粘贴给盗用去另很多站长感到非常无奈&#xff0c;通常大家复制都会使用选取右键复制&#xff0c;或CTRLC等方式&#xff0c;下面介绍几种禁止鼠标右键代码&#xff0c;可减少网页上文章被抄袭的几率&#xff0c;当然…

机器学习——终身学习

终身学习 AI不断学习新的任务&#xff0c;最终进化成天网控制人类终身学习&#xff08;LLL&#xff09;&#xff0c;持续学习&#xff0c;永不停止的学习&#xff0c;增量学习 用线上收集的资料不断的训练模型 问题就是对之前的任务进行遗忘&#xff0c;在之前的任务上表现不好…

用C语言打造自己的Unix风格ls命令

在Unix或类Unix操作系统中&#xff0c;ls是一个非常基础且实用的命令&#xff0c;它用于列出当前目录或指定目录下的文件和子目录。下面&#xff0c;我们将通过C语言编写一个简化的ls命令&#xff0c;展示如何利用dirent.h头文件提供的函数接口实现这一功能。 #include "…

发布镜像到阿里云仓库

发布上一篇Dockerfile实战-自定义的centos镜像。 1、登录阿里云 2、找到容器镜像服务 3、创建命令空间 4、创建镜像仓库 5、点击进入这个镜像仓库&#xff0c;可以看到所有的信息 6、根据操作指南测试推送发布 6.1登录阿里云 [rootzhoujunru home]# docker login --usernam…

开箱即用之 windows部署jdk、设置nginx、jar自启

jdk安装 官网下载对应的安装包&#xff0c;解压之后放在本地指定的文件夹下 传送门https://www.oracle.com/java/technologies/downloads/#jdk21-windows 我比较喜欢下载zip方式的&#xff0c;解压之后直接能用&#xff0c;不需要安装了 配置环境 JAVA_HOME 添加path路径 …

Nebula Graph-01-Nebula Graph简介和安装以及客户端连接

前言 NoSQL 数据库 图数据库并不是可以克服关系型数据库缺点的唯一替代方案。现在市面上还有很多非关系型数据库的产品&#xff0c;这些产品都可以叫做 NoSQL。NoSQL 一词最早于上世纪 90 年代末提出&#xff0c;可以解释为“非 SQL” 或“不仅是 SQL”&#xff0c;具体解释要…

蓝桥练习题总结(一)字母图形、完美的代价、01串、序列求和

目录 一、字母图形 二、完美的代价 三、01字串 四、序列求和 一、字母图形 问题描述 利用字母可以组成一些美丽的图形&#xff0c;下面给出了一个例子&#xff1a; ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 这是一个5行7列的图形&#xff0c;请找出这个图形的规律&#xff…

本地gitlab-runner的创建与注册

引言 之前通过一些方式在本地创建runner&#xff0c;时而会出现一些未知的坑&#xff0c;所以写下本文记录runner可以无坑创建的方式。 以下注册runner到相应仓库的前提是已经在本地安装了gitlab-runner 具体安装方式见官网 本地gitlab-runner安装常用的指令 查看gitlab r…

SQLiteC/C++接口详细介绍之sqlite3类(十八)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十七&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;一&#xff09; ​ 56.sqlite3_update_hook 函数功能&am…

Vue.js前端开发零基础教学(二)

目录 前言 2.1 单文件组件 2.2 数据绑定 2.2.2 响应式数据绑定 2.3 指令 2.3.1 内容渲染指令 2.3.2 属性绑定指令 ​编辑 2.3.3 事件绑定指令 2.3.4 双向数据绑定指令 2.3.5 条件渲染指令 2.3.6 列表渲染指令 2.4 事件对象 2.5 事件修饰符 学习目标&am…

【CKA模拟题】学会JSONPath,精准定位Pod信息!

题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesyou have a script named pod-filter.sh . Update this script to include a command that filters and displays the label with the…

STM32-DMA数据转运

DMA进行转运的条件 1&#xff1a;开关控制&#xff0c;DMA_CMD必须使能2&#xff1a;传输计数器必须大于03&#xff1a;触发源必须有触发的信号

【c++】c++背景(c++的前世今生)

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1. 什么是C 2. C发展史 3. C的重要性 3.1 语言的使用广泛度 3.2在工作邻域 1. 操作系统以及大型系统软件开发 2. 服务器端开发 3. …

OSPF路由汇总

OSPF只要是环回接口&#xff08;默认P2P网络类型&#xff09;&#xff0c;默认都是32位的叶子信息。手动修改&#xff0c;[R1-LoopBack0]ospf network-type broadcast&#xff1b;修改网络类型。 OSPF不支持自动汇总&#xff0c;需要手动汇总。 一、OSPF路由汇总 使用CIDR技术…

java数据结构与算法刷题-----LeetCode135. 分发糖果

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 左右遍历2. 进阶&#xff1a;常数空间遍历&#xff0c;升序降…

【四 (6)数据可视化之 Grafana安装、页面介绍、图表配置】

目录 文章导航一、Grafana介绍[✨ 特性]二、安装和配置1、安装2、权限配置&#xff08;账户/团队/用户&#xff09;①用户管理②团队管理③账户管理④看板权限 3、首选项配置4、插件管理①数据源插件②图表插件③应用插件④插件安装方式一⑤安装方式二 三、数据源管理1、添加数…

内表-ABAP开发从入门到精通笔记

内表 概念 内表是在程序内部定义的表。是定义在内存中&#xff0c;所以运行速度会比磁盘中是实体表快很多。 内表的定义&#xff0c;可以通过type来定义&#xff0c;也可以通过变量来定义。 例如&#xff1a;先定义一个结构体&#xff0c;然后再通过结构体定义内表 先顶一个结…

合合信息扫描全能王亮相静安区3·15活动,AI扫描带来绿色消费新体验

保护消费者的合法权益&#xff0c;是全社会的共同责任。为优化消费环境、促进品质消费高地建设&#xff0c;打造安全优质和谐的消费环境&#xff0c;上海静安区消保委于3月15日举办静安区2024年“315”国际消费者权益日活动。 “激发消费活力&#xff0c;绿色低碳同行”是本次3…