Leetcode29题两数相除

题目

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

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

示例一:
输入: dividend = 10, divisor = 3
输出: 3

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

说明:

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

题解

本题利用二分思想来模拟除法运算操作,每轮不是减去除数,而是减去所能减掉的最大数,通过位运算来快速定位出所能减去的最大数。为了防止出现int型所表示的最小负数转换为正数的溢出情况,先把所有数都转换为负数进行处理,采用异或运算来快速定位结果符号。具体方法如代码所示:

class Solution {
    public int divide(int dividend, int divisor) {
        //参考题解区解法,将所有的数转换为负数进行求解
        boolean sign = (dividend > 0) ^ (divisor > 0);
        if(dividend > 0){
            dividend = -dividend;
        }
        if(divisor > 0){
            divisor = -divisor;
        }
        int tempDivisor = 0;
        int tempResult = 0;
        int result = 0;
        while(dividend <= divisor){
            tempDivisor = divisor;    //每一次都重新开始减去除数的倍数,要减去可以减掉的最大除数倍数
            tempResult = -1;
            while(dividend <= (tempDivisor << 1)){   //不断左移除数,每一个while循环就是可以减去最多的除数的一轮
                if(tempDivisor <= (Integer.MIN_VALUE >> 1)){    //如果超过了所能表示的最大数,则跳出
                    break;
                }
                tempResult <<= 1;
                tempDivisor <<= 1;
            }
            dividend = dividend - tempDivisor;     //被除数减去已经一轮最大可以减去的除数
            result += tempResult;    //商加上减去除数的倍数
        }
        if(!sign){
            if(result <= Integer.MIN_VALUE){
                return Integer.MAX_VALUE;
            }
            result = -result;
        }
        return result;
    }
}

参考:https://leetcode-cn.com/problems/divide-two-integers/solution/zhi-xing-shi-jian-1msji-bai-100-by-luca-zhao/

原文地址:https://www.cnblogs.com/jianglinliu/p/11830748.html

时间: 2024-10-11 02:47:26

Leetcode29题两数相除的相关文章

[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 = $-

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

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

LeetCode 29两数相除

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

leetcode刷题--两数之和(简单)

一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然你的基础也要扎实,毕竟在技术面的时候很容易露馅的. 所以奉劝各位还未毕业,在大三或大二的师弟师妹早点刷题,心里也有底气进入求职大军,毕竟大四开始刷题的话时间上有些太紧了,推荐刷题的话就是牛客和leetcode. 回归正题,这次记录的是leetcode刷的第一题--两数之和. 二.审题 审题真的很重要

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

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

LeetCode刷题:第一题 两数之和

从今天开始刷LeetCode 第一题:两数之和 题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 代码如下: 1 /** 2 * Note: The retur

LeetCode算法题——两数之和(python)

两数之和: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数.你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用.例如:给定 nums = [2, 7, 11, 15], target = 9.由nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1] 原文地址:http://blog.51cto.com/13921683/2318829

LeetCode 第2题 两数相加

/* T2:两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. 您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807*/ /** * Definition for