leetcode_29.两数相除

29. 两数相除

题目描述:给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。

整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。

返回被除数 dividend 除以除数 divisor 得到的  。

注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231,  231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。

示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333.. ,向零截断后得到 3 。

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。

提示:

  • -231 <= dividend, divisor <= 231 - 1
  • divisor != 0
代码思路: 
  1. 边界检查 :如果被除数(dividend)为0,直接返回0,因为0除以任何数都是0

  2. 特殊情况处理: 如果被除数是Integer.MIN_VALUE(-2^31),并且除数是-1,直接返回Integer.MAX_VALUE,因为除以-1会导致溢出

  3. 确定结果的符号: 利用异或操作^,如果两个数的符号不同,结果为负

  4. 转换为长整型并取绝对值: 要处理可能超出整数范围的情况,将被除数和除数都转换为长整型,并取绝对值

  5. 进行除法操作: 使用一个循环从最高位开始,逐步检查被除数是否大于或等于除数的2的幂(2^n * 除数);如果是,那么将结果加上2的n次幂,并从被除数中减去2的n次幂乘以除数,这样循环直到检查完所有

这种方法的思路是通过逐步减去2的n次幂乘以除数来模拟除法过程,而不是使用传统的除法操作。

class Solution {
    public int divide(int dividend, int divisor) {
        if (dividend == 0) return 0;
        if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;

        boolean flag = (dividend ^ divisor) < 0;
        long a = Math.abs(dividend);
        long b = Math.abs(divisor);

        int ans = 0;
        for (int i = 31; i >= 0; i--) {
            if ((a >> i) >= b) {
                ans += 1 << i;
                a -= b << i;
            }
        }
        if (flag) return -ans;
        else return ans;
    }
}
核心代码分析:
if ((a >> i) >= b) {
    ans += 1 << i;
    a -= b << i;
}
  1. 检查被除数是否足够大: a >> i:这是一个右移操作,它将被除数 a 向右移动 i 位。是在检查 a 是否大于或等于 b 的2的i次幂,也就是2^i * b;(a >> i) >= b:如果被除数 a 右移 i 位后仍大于或等于 b ,说明2^i * b是 a 的一个有效的部分

  2. 更新结果: ans += 1 << i;:如果2^i * b是 a 的有效部分,将结果 ans 增加 2^i,记录 a 中有多少个 b

  3. 更新被除数: a -= b << i;:这是两步操作的结果,首先,b << i计算出 2^i * b,然后这个值从 a 中减去,模拟实际的除法过程

相关推荐

  1. LeetCode 29. 相除

    2024-04-26 16:50:04       64 阅读
  2. Leetcode29:相除

    2024-04-26 16:50:04       45 阅读
  3. leetcode_29.相除

    2024-04-26 16:50:04       32 阅读
  4. 29. 相除 —— LeetCode (python)

    2024-04-26 16:50:04       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-26 16:50:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-26 16:50:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-26 16:50:04       82 阅读
  4. Python语言-面向对象

    2024-04-26 16:50:04       91 阅读

热门阅读

  1. 前端深度学习Vue2框架(四)

    2024-04-26 16:50:04       36 阅读
  2. js中页面请求高并发的处理,限制最大请求数量

    2024-04-26 16:50:04       32 阅读
  3. 二叉树的三种遍历方式非递归

    2024-04-26 16:50:04       35 阅读
  4. MySQL 查询优化思路

    2024-04-26 16:50:04       113 阅读
  5. 学python的第二十一天

    2024-04-26 16:50:04       147 阅读
  6. SQL CASE 语句

    2024-04-26 16:50:04       34 阅读
  7. 2024.4.26力扣每日一题——快照数组

    2024-04-26 16:50:04       143 阅读
  8. Linux 抽象命名空间(Abstract Namespace)详细介绍

    2024-04-26 16:50:04       36 阅读