算法问题:整数除法详解(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方向)相关推荐

  1. 枚举算法经典日期问题详解java

    目录 枚举算法 日期问题 枚举思想 具体代码 枚举算法 枚举算法是我们在日常中使用到的最多的一个算法,它的核心思想就是:枚举所有的可能. 枚举法的本质就是从所有候选答案中去搜索正确的解. 使用该算法需 ...

  2. java斐波那契查找_详解Java Fibonacci Search斐波那契搜索算法代码实现

    一, 斐波那契搜索算法简述 斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术. 斐波那契搜索采用分而治之的方法,其中我们按照斐波那契数列对元素进行不均等 ...

  3. 希尔排序基础java代码_java 算法之希尔排序详解及实现代码

    摘要:这篇Java开发技术栏目下的"java 算法之希尔排序详解及实现代码",介绍的技术点是"希尔排序详解.实现代码.希尔排序.Java.实现.代码",希望对大 ...

  4. java同步异步调用_详解java 三种调用机制(同步、回调、异步)

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...

  5. 操作系统:基于页面置换算法的缓存原理详解(下)

    概述: 在上一篇<操作系统:基于页面置换算法的缓存原理详解(上)>中,我们主要阐述了FIFO.LRU和Clock页面置换算法.接着上一篇说到的,本文也有三个核心算法要讲解.分别是LFU(L ...

  6. 详解Java多线程编程中LockSupport类的线程阻塞用法

    转载自  详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...

  7. 详解Java中的正则表达式

    详解Java中的正则表达式,并列出常用的正则表达式语法和一些常用的场景. 判断一个字符串是否是由数字组成: 当不使用正则表达式的时候的实现代码: public class RegexDemo01 {p ...

  8. 第三节:带你详解Java的操作符,控制流程以及数组

    前言 大家好,我是 Vic,今天给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. ...

  9. java sleep唤醒_详解Java中的线程让步yield()与线程休眠sleep()方法

    Java中的线程让步会让线程让出优先级,而休眠则会让线程进入阻塞状态等待被唤醒,这里我们对比线程等待的wait()方法,来详解Java中的线程让步yield()与线程休眠sleep()方法 线程让步: ...

最新文章

  1. 默的各种写法图片_SEO标题写法?
  2. apache .htaccess 禁止访问某目录方法
  3. 关于超级计算机的英语作文,中国研制出世界最强超级计算机
  4. Linux Mysql 安装方法
  5. 时光老人的飞鸽传书下载
  6. ajax then jquery,使用Jquery.ajax()。then()时无法.catch()错误
  7. 好消息,MaxtoCode 1.10 已经封包,待2005.5.5日发布(如果有Bug将在1.20改正)
  8. 小米路由器4C刷机(以OpenWrt为例)
  9. QQ坦白说查看好友方法攻略
  10. 基于Python实现的基金交易系统
  11. 五款优秀重复文件查找工具
  12. ZKP+图片授权——PhotoProof:proofs of permissible photo edits
  13. [Kafka][错误: 找不到或无法加载主类 Files\Java\jdk1.8.0_101\lib\dt.jar;C:\Program]
  14. C#打印标签(包括二维码和一位条码)
  15. 怎样将HTML保存到d盘,怎么保存网页 保存整个网页的办法
  16. 研究亥姆霍兹线圈轴线磁场分布
  17. 中大南方学院计算机温澍潜,中大南方学院“男神”老师刷爆学生朋友圈
  18. 阿里云服务器配置如何选
  19. pdb python 命令_使用pdb进行Python调试(下)
  20. 人大金仓数据库备份应用sys_dump的使用

热门文章

  1. FireFox火狐、chrome谷歌浏览器没有标签页和窗口关闭快捷键
  2. 人工智能到底有多强大?
  3. PostGis函数使用
  4. IBM x3690 x5服务器安装Debian Linux
  5. 2023年贵州大学文艺学专业考研上岸经验
  6. 用的五大bug管理工具的优缺点和下载地址
  7. 使用js关闭浏览器的方法
  8. 最小安装CentOS 7.6 Linux系统(无UI界面纯命令行,虚拟机教学)
  9. persepolis download manager中文版(pdm下载器)
  10. 介绍几本学习Tkinter的书籍