LeetCode 29两数相除

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

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

示例 1:

输入: dividend = 10, divisor = 3
输出: 3

示例 2:

输入: dividend = 7, divisor = -3
输出: -2

说明:

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

解法

  • 对于存在整数上下界的问题可以直接转化为long型,计算完毕之后统一判断是否越界
  • 为了方便计算将除数与被除数统一转化为正数,商的符号单独判断
  • 除法本质还是计算倍数关系,可以使用循环减,通过计算减了多少次得出倍数关系
  • 在循环减时注意使用倍增的逼近方式:除数以翻倍的方式递增,来达到快速逼近被除数的目的

代码

class Solution {

    public int divide(int dividend, int divisor) {
        long dividendLong = dividend;
        long divisorLong = divisor;
        boolean positive = true;
        positive = (dividend < 0) != positive;
        positive = (divisor < 0) != positive;
        dividendLong = Math.abs(dividendLong);
        divisorLong = Math.abs(divisorLong);
        long quotient = 0;
        while (dividendLong >= divisorLong) {
            long dividenLongLeft = dividendLong;
            long cnt = 0;
            for (long divisorSum = divisorLong; divisorSum <= dividendLong; divisorSum += divisorSum) {
                cnt += divisorSum > divisorLong ? cnt : 1;
                dividenLongLeft = dividendLong - divisorSum;
            }
            dividendLong = dividenLongLeft;
            quotient += cnt;
        }
        quotient = positive ? quotient : -quotient;
        return quotient > Integer.MAX_VALUE || quotient < Integer.MIN_VALUE ? Integer.MAX_VALUE : (int) quotient;
    }
}

原文地址:https://www.cnblogs.com/migoo/p/9436647.html

时间: 2024-11-08 07:02:54

LeetCode 29两数相除的相关文章

[leetcode] 29. 两数相除

29. 两数相除 感觉是目前遇到过的最'难'过的题... 不让你用乘除法,看样子又是个涉及位运算的题. 上来打算暴力,只用减法,结果超时. 没啥想法,遂google了一下,发现可以用位运算左移操作,将divisor变大,直到divisor << 1 < dividend ,假设此时左移了k次,这时after_divisor = 2^k * origin_divisor.此时dividend再减去after_divisor,这不相当于重复了之前暴力算法中2^k次减法操作嘛. 之后可以重复寻

LeetCode 29 - 两数相除 - [位运算]

题目链接:https://leetcode-cn.com/problems/divide-two-integers/description/ 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输入: dividend = $10$, divisor = $3$输出: $3$ 示例 2: 输入: dividend = $7$, divisor = $-

LeetCode 29——两数相除

1. 题目 2. 解答 2.1. 方法一 题目要求不能使用乘法.除法和除余运算,但我们可以将除法转移到对数域. $$ \frac{a}{b} = e^{\frac{lna}{lnb}} = e^{lna - lnb}$$ 这样就转化为指数.对数和减法运算了.因为只能对正整数取对数,因此我们首先要将两个数都取绝对值,最后再加上符号. 同时,题目要求只能存储 32 位有符号整数,因此,当数据大于上边界时,需要进行特殊处理. class Solution { public: int divide(in

LeetCode 29. 两数相除 时间击败【100.00%】 内存击败【76.25%】

不禁让我想起了计算机是怎样进行除法运算的,单独考虑溢出以及边界情况,单独考虑符号,其他过程和我们小学除法是一模一样的:左移除数(十进制就是扩大十倍,二进制扩大两倍),直到正好比被除数小,一边累加商(在我的代码里就是33行)一边减小被除数,直到被除数不能减小,右移除数,重复上述过程. 1 public int divide(int dividend, int divisor) { 2 if (dividend == Integer.MIN_VALUE && divisor == -1) re

每天AC系列(十三):两数相除

1 题目 LeetCode第29题,计算两数相除的商,不允许使用乘法,除法,求模运算符. 2 减法 首先判断结果是否需要加上负号,将商置为0后,被除数不断减去除数,同时商自增.最后根据是否有负号返回相应的商. boolean negative = true; if((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) negative = false; dividend = d

[算法] LeetCode 1.两数之和

LeetCode 1.两数之和(python) 1.朴素解法 最朴素的两个for循环大法: class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: for i in range(len(nums)): for j in range(i+1,len(nums)): if nums[i] + nums[j] == target: return [i, j] 但注意,不要用enumerate函数写,会超时

Leetcode29题两数相除

题目 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例一: 输入: dividend = 10, divisor = 3 输出: 3 示例二: 输入: dividend = 7, divisor = -3 输出: -2 说明: 1.被除数和除数均为 32 位有符号整数.2.除数不为 0.3.假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−23

前端与算法 leetcode 1. 两数之和

目录 # 前端与算法 leetcode 1. 两数之和 题目描述 概要 提示 解析 解法一:暴力法 解法二:HashMap法 算法 传入[2,7,11,1,12,34,4,15],19的运行结果 执行结果 GitHub仓库 # 前端与算法 leetcode 1. 两数之和 题目描述 给定一个整数数组 nums?和一个目标值 target,请你在该数组中找出和为目标值的那?两个?整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给

两数相除,判断小数位是否有限位

You are given several queries. Each query consists of three integers p, q and b. You need to answer whether the result of p/q in notation with base b is a finite fraction. A fraction in notation with base b is finite if it contains finite number of n