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。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/divide-two-integers
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    这道题在考察什么?我个人感觉是对除的理解和左移的理解。

    这个方法实际上就是用逻辑实现左移,但是超出时间限制

    class Solution {
        public int divide(int dividend, int divisor) {
            if (dividend == 0) {
                return 0;
            }
            if (divisor == 1) {
                return dividend;
            }
            if (divisor == -1) {
                if (dividend > Integer.MIN_VALUE) {
                    return -dividend;
                } else {
                    return Integer.MAX_VALUE;
                }
            }
            int a = dividend;
            int b = divisor;
            int sign = 1;
            if ((a > 0 && b < 0) || (a < 0 && b > 0)) {
                sign = -1;
            }
    
            a = a > 0 ? a : -a;
            b = b > 0 ? b : -b;
    
            int res = div(a, b);
            if (sign > 0) {
                return res > Integer.MAX_VALUE ? Integer.MIN_VALUE : res;
            }
            return -res;
        }
        public static int div(int a, int b) {
            if (a < b) {
                return 0;
            }
            int count = 1;
            int tb = b;
    
            while ((tb + tb) <= a) {
                count  = count + count;
                tb = tb + tb;
            }
            return count + div(a - tb, b);
        }
    }

    另一个方案

    class Solution {
        public int divide(int dividend, int divisor) {
            boolean sign = (dividend > 0) ^ (divisor > 0);
            int result = 0;
            if(dividend>0) {
                dividend = -dividend;
            }
            if(divisor>0) divisor = -divisor;
            while(dividend <= divisor) {
                int temp_result = -1;
                int temp_divisor = divisor;
                while(dividend <= (temp_divisor << 1)) {
                    if(temp_divisor <= (Integer.MIN_VALUE >> 1))break;
                    temp_result = temp_result << 1;
                    temp_divisor = temp_divisor << 1;
                }
                dividend = dividend - temp_divisor;
                result += temp_result;
            }
            if(!sign) {
                if(result <= Integer.MIN_VALUE) return Integer.MAX_VALUE;
                result = - result;
            }
            return result;
        }
    }

    end

    一个小知识点就是符号是占最高位的。int的最大最小值不要搞混。

    一个没有高级趣味的人。 email:hushui502@gmail.com
  • 相关阅读:
    判断ArryaList有没有重复对象的方法
    使用Java对字符串进行升序排序
    用三层盒子结构实现多边框
    盒子模型的margin负数用法
    解决盒子浮动时margin会显示两倍的美观问题
    纯HTML和CSS实现JD轮播图
    Java的策略模式
    Java的适配器模式
    Java的单例模式
    阿里云服务器配置
  • 原文地址:https://www.cnblogs.com/CherryTab/p/12158594.html
Copyright © 2011-2022 走看看