• 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
  • 相关阅读:
    Maven相关
    System.Math 方法
    css简单实现五角星评分、点赞收藏、展示评分(半颗星、1/3颗星)
    微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示
    如何基于layui的laytpl实现数据绑定
    layui表格和弹出框的简单示例
    css超简单实现div页面居中【适合做弹出框】
    如何简单方便的用字体代替页面中常见常用的小图标小按钮(上)
    用css3的cursor:zoom-in/zoom-out实现微博看图片放大镜效果
    完整版ajax+百度echarts实现统计图表demo并随着窗口大小改变而自适应
  • 原文地址:https://www.cnblogs.com/CherryTab/p/12158594.html
Copyright © 2020-2023  润新知