算法问题:整数除法详解(Java方向)
算法问题:整数除法详解(Java方向)
- 1.力扣题目
- 2.结果代码分析
- 3.完整的结果代码
- 4.代码出处和教学出处
- 5.博主 边学习边记录算法的学习
1.力扣题目
1.给定两个整数 a 和 b ,求它们的除法的商 a/b?2.要求:不得使用 乘号 '*'、除号 '/' 、求余 '%' 。
2.结果代码分析
if (a == Integer.MIN_VALUE && b == -1) { return Integer.MAX_VALUE; }
1.首先,对参数的边界值进行判断。如果被除数a是整形的最小值,并且除数b是-1的情况下,正常运算的结果为被除数a本身。实际:结果为整形的最大值,所以需要排除这种情况。遇到情况,直接返回结果即可。(1)Integer.MIN_VALUE相关:1.在JDK中,整形类型是有范围的,2.最大值为Integer.MAX_VALUE,即2147483647。3.最小值为Integer.MIN_VALUE,即-2147483648。4.对整形最大值加1,即2147483648。其结果是-2147483648,即Integer.MIN_VALUE。5.对Integer.MIN_VALUE取反或者取绝对值,其结果是-2147483648,即Integer.MIN_VALUE。(因为取反后整形达到超过范围,成为最小值)(2)&&相关:1.&&运算符是 短路与 运算。2.如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。
int sign = (a > 0) ^ (b > 0) ? -1 : 1;
2.其次,被除数a和除数b进行正负的判断。如果被除数a和除数b都大于0,则返回-1;如果有一方为负数,则返回1。实际:记录a和b是否都大于0后,作用于最终结果的符号判断。(1)^(按位异或)相关:1.运算符是 按位异或 运算。2.任意相同二进制位进行^运算,结果为0;任意不同二进制位进行 ^ 运算,结果为1。(2)(条件表达式)?表达式1:表达式2 相关:1.先判断条件表达式的值,若为true,运算结果为表达式1;若为false,运算结果为表达式2。
a = Math.abs(a); b = Math.abs(b);
3.然后,对被除数a、除数b 都取绝对值。 (1)Math.abs() 相关:获得其绝对值。如果参数等于 Integer.MIN_VALUE 的值(即能够表示的最小负 int 值),那么结果与该值相同且为负。
int res = 0;
4.再然后,对结果res进行初始化。
for (int i = 31; i >= 0; i--) {
if ((a >>> i) - b >= 0) {
a -= (b << i) ;
if (res > Integer.MAX_VALUE - (1 << i)) {
return Integer.MIN_VALUE;
}
res += (1 << i);
}
}
5.再然后,在for循环进行逻辑编写,i从31开始递减,进行循环。(每次尝试从最大的位数开始尝试)1)如果 被除数a右移i后,和除数b相减大于0,继续进行判断。2)重要逻辑:不能使用除法、乘法后,可以使用减法减去除数b来判断商。为了提高代码效率,使用位运算符,让被除数a在减去 除数b的2的i次幂 的情况下去使用减法判断商。3)代码优化:res += (1 << i); 这里控制 res 大于等于 INT_MAXPS:无符号右移为了将 Int最小值 看成 2147483648,同时不用担心越界。以(a >>> i) - b >= 0的格式,可以防止出现:除数b为最小值,导致永远为true的情况。(1)>>>相关:在表达式中执行无符号右移。
return sign == 1 ? res : -res;
6.最后,因为不能使用乘号,所以将乘号换成三目运算符
3.完整的结果代码
// 时间复杂度:O(1)public int divide(int a, int b) {if (a == Integer.MIN_VALUE && b == -1)return Integer.MAX_VALUE;int sign = (a > 0) ^ (b > 0) ? -1 : 1;a = Math.abs(a);b = Math.abs(b);int res = 0;for (int i = 31; i >= 0; i--) {// 首先,右移的话,再怎么着也不会越界// 其次,无符号右移的目的是:将 -2147483648 看成 2147483648// 注意,这里不能是 (a >>> i) >= b 而应该是 (a >>> i) - b >= 0// 这个也是为了避免 b = -2147483648,如果 b = -2147483648// 那么 (a >>> i) >= b 永远为 true,但是 (a >>> i) - b >= 0 为 falseif ((a >>> i) - b >= 0) { // a >= (b << i)a -= (b << i);// 代码优化:这里控制 res 大于等于 INT_MAXif (res > Integer.MAX_VALUE - (1 << i)) {return Integer.MIN_VALUE;}res += (1 << i);}}// bug 修复:因为不能使用乘号,所以将乘号换成三目运算符return sign == 1 ? res : -res;}
4.代码出处和教学出处
代码和逻辑相关原文链接:作者:tangweiqun来源:力扣(LeetCode)原文链接:https://leetcode-cn.com/problems/xoh6Oh/solution/jian-dan-yi-dong-javac-pythonjs-zheng-sh-e8r6/Integer.MIN_VALUE相关原文链接:来源:CSDN原文链接:https://blog.csdn.net/wujumei1962/article/details/44104895and(&)运算 (按位与)^(按位异或)相关原文链接:来源:CSDN原文链接:https://blog.csdn.net/zhongjling/article/details/8004103
5.博主 边学习边记录算法的学习
欢迎各位大佬评论、指点,第一次写博客有很多失误,希望可以帮助小部分人。
祝大家早日推开算法成神之路。
算法问题:整数除法详解(Java方向)相关推荐
- 枚举算法经典日期问题详解java
目录 枚举算法 日期问题 枚举思想 具体代码 枚举算法 枚举算法是我们在日常中使用到的最多的一个算法,它的核心思想就是:枚举所有的可能. 枚举法的本质就是从所有候选答案中去搜索正确的解. 使用该算法需 ...
- java斐波那契查找_详解Java Fibonacci Search斐波那契搜索算法代码实现
一, 斐波那契搜索算法简述 斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术. 斐波那契搜索采用分而治之的方法,其中我们按照斐波那契数列对元素进行不均等 ...
- 希尔排序基础java代码_java 算法之希尔排序详解及实现代码
摘要:这篇Java开发技术栏目下的"java 算法之希尔排序详解及实现代码",介绍的技术点是"希尔排序详解.实现代码.希尔排序.Java.实现.代码",希望对大 ...
- java同步异步调用_详解java 三种调用机制(同步、回调、异步)
1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...
- 操作系统:基于页面置换算法的缓存原理详解(下)
概述: 在上一篇<操作系统:基于页面置换算法的缓存原理详解(上)>中,我们主要阐述了FIFO.LRU和Clock页面置换算法.接着上一篇说到的,本文也有三个核心算法要讲解.分别是LFU(L ...
- 详解Java多线程编程中LockSupport类的线程阻塞用法
转载自 详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...
- 详解Java中的正则表达式
详解Java中的正则表达式,并列出常用的正则表达式语法和一些常用的场景. 判断一个字符串是否是由数字组成: 当不使用正则表达式的时候的实现代码: public class RegexDemo01 {p ...
- 第三节:带你详解Java的操作符,控制流程以及数组
前言 大家好,我是 Vic,今天给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. ...
- java sleep唤醒_详解Java中的线程让步yield()与线程休眠sleep()方法
Java中的线程让步会让线程让出优先级,而休眠则会让线程进入阻塞状态等待被唤醒,这里我们对比线程等待的wait()方法,来详解Java中的线程让步yield()与线程休眠sleep()方法 线程让步: ...
最新文章
- 默的各种写法图片_SEO标题写法?
- apache .htaccess 禁止访问某目录方法
- 关于超级计算机的英语作文,中国研制出世界最强超级计算机
- Linux Mysql 安装方法
- 时光老人的飞鸽传书下载
- ajax then jquery,使用Jquery.ajax()。then()时无法.catch()错误
- 好消息,MaxtoCode 1.10 已经封包,待2005.5.5日发布(如果有Bug将在1.20改正)
- 小米路由器4C刷机(以OpenWrt为例)
- QQ坦白说查看好友方法攻略
- 基于Python实现的基金交易系统
- 五款优秀重复文件查找工具
- ZKP+图片授权——PhotoProof:proofs of permissible photo edits
- [Kafka][错误: 找不到或无法加载主类 Files\Java\jdk1.8.0_101\lib\dt.jar;C:\Program]
- C#打印标签(包括二维码和一位条码)
- 怎样将HTML保存到d盘,怎么保存网页 保存整个网页的办法
- 研究亥姆霍兹线圈轴线磁场分布
- 中大南方学院计算机温澍潜,中大南方学院“男神”老师刷爆学生朋友圈
- 阿里云服务器配置如何选
- pdb python 命令_使用pdb进行Python调试(下)
- 人大金仓数据库备份应用sys_dump的使用