zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    053(二十五)
    053(二十四)
    053(二十三)
    053(二十二)
    053(二十一)
    053(二十)
    053(十九)
    053(十八)
    053(十七)
    单例设计模式
  • 原文地址:https://www.cnblogs.com/migoo/p/9436647.html
Copyright © 2011-2022 走看看