剑指 Offer II 001. 整数除法

166 阅读2分钟
theme: channing-cyan

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

一、题目描述:

给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 '*'、除号 '/' 以及求余符号 '%' 。

注意:

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231−1]。本题中,如果除法结果溢出,则返回 231 − 1

示例 1:

输入:a = 15, b = 2 输出:7 解释:15/2 = truncate(7.5) = 7 示例 2:

输入:a = 7, b = -3 输出:-2 解释:7/-3 = truncate(-2.33333..) = -2 示例 3:

输入:a = 0, b = 1 输出:0 示例 4:

输入:a = 1, b = 1 输出:1

提示:

-231 <= a, b <= 231 - 1 b != 0

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/xo…

二、思路分析:

此题要求的是两个整数的除法的商,并且要求不得使用*、/、%符号,那么能够想到的办法就是位运算了,除法,那就是右移了,右移一位相当于除以2。具体过程如下:

设置一个变量,用来记录正数个数,以便在最后的结果调整正负号。

特殊情况,可能溢出的情况讨论,由于是整数除法,除数不为0,商的值一定小于等于被除数的绝对值,因此,int型溢出只有一种情况,(-2^31)/(-1) = 2^31。

举例说明

17除以2,17 大于 2,也大于 4 (2 * 2 ^ (1)),也大于 8 (2 * 2 ^ (2)),也大于 16 (2 * 2 ^ (3)),但是小于 32 (2 * 2 ^ (4)),于是将 17 - 16 得到 1,并记录此时的答案 8,剩下的被除数 1,已经小于 2,最终结果为 8 + 1 = 9。

三、AC 代码:

class Solution {
   public int divide(int dividend, int divisor) {
​
        if(dividend == 0x80000000 && divisor == -1){
            return 0x7FFFFFFF; 
        }
​
        int negative = 2;
​
        if(dividend > 0){
            negative --;
            dividend = -dividend;
        }
​
        if(divisor > 0){
            negative --;
            divisor = -divisor;
        }
​
        int result = 0;
        while(dividend <= divisor){   
            dividend -= divisor;
            result++;
        }
        
        return negative == 1 ? -result : result;
​
    }
​
}

四、总结:

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐