zoukankan      html  css  js  c++  java
  • 乘风破浪:LeetCode真题_029_Divide Two Integers

    乘风破浪:LeetCode真题_029_Divide Two Integers

    一、前言

        两个整数相除,不能使用乘法除法和取余运算。那么就只能想想移位运算和加减法运算了。

    二、Divide Two Integers

    2.1 问题

    2.2 分析与解决

         通过分析,我们可以想到,如果使用加法,一次次的减下去,每减一次就加一,直到最后的减数小于除数。但是这样的时间复杂度将会是非常的大,比如100000,3这两个数,非常的耗时,那么如何加快运算呢,我们想到了移位运算。

    public class Solution {
        /**
         * 题目大意:
         * 不使用除法,乘法和取余,求两个整数的相除的结果,如果有溢出就返回最大的整数
         *
         * 解题思路:
         * 任何一个整数可以表示成以2的幂为底的一组基的线性组合,
         * 即num=a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n。
         * 基于以上这个公式以及左移一位相当于乘以2,我们先让除
         * 数左移直到大于被除数之前得到一个最大的基。然后接下来我们
         * 每次尝试减去这个基,如果可以则结果增加加2^k,然后基继续右
         * 移迭代,直到基为0为止。因为这个方法的迭代次数是按2的幂知
         * 道超过结果,所以时间复杂度为O(log(n))。
         *
         */
        public int divide(int dividend, int divisor) {
            // 相除时溢出处理
            if (divisor == 0 || dividend == Integer.MIN_VALUE && divisor == -1) {
                return Integer.MAX_VALUE;
            }
    
            // 求符号位,异或运算
            int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
    
            // 求绝对值,为防止溢出使用long
            long dvd = Math.abs((long) dividend);
            long dvs = Math.abs((long) divisor);
    
            // 记录结果
            int result = 0;
    
            // 被除数大于除数
            while (dvd >= dvs) {
                // 记录除数
                long tmp = dvs;
                // 记录商的大小
                long mul = 1;
    
                while (dvd >= (tmp << 1)) {
                    tmp <<= 1;
                    mul <<= 1;
                }
    
                // 减去最接近dvd的dvs的指数倍的值(值为tmp)
                dvd -= tmp;
    
                // 修正结果
                result += mul;
            }
    
            return result * sign;
        }
    }
    

    三、总结

       当我们没有办法的时候不妨想想移位操作,这样能极大的提升我们的操作速度和效率。

  • 相关阅读:
    Linux 的特殊变量(2)
    Shell 的特殊变量
    linux shell 基本规范
    Linux C 程序的开发环境
    编译和连接
    编程语言与C语言的简介
    Python条件判断和循环语句
    Python基本数据类型
    Java基本数据类型
    Jmeter(1)下载和安装
  • 原文地址:https://www.cnblogs.com/zyrblog/p/10222531.html
Copyright © 2011-2022 走看看