zoukankan      html  css  js  c++  java
  • [leetcode] 29. 两数相除

    29. 两数相除
    感觉是目前遇到过的最‘难’过的题。。。

    不让你用乘除法,看样子又是个涉及位运算的题。

    上来打算暴力,只用减法,结果超时。

    没啥想法,遂google了一下,发现可以用位运算左移操作,将divisor变大,直到divisor << 1 < dividend ,假设此时左移了k次,这时after_divisor = 2^k * origin_divisor。此时dividend再减去after_divisor,这不相当于重复了之前暴力算法中2^k次减法操作嘛。

    之后可以重复寻找新的after_divisor,直到dividend < origin_divisor ,即表示dividend已经小到不能再减了。

    此题leetcode提供了多达近1000个测试用例。。。各种边界条件啊- -,实在受不了改用long来做了。

    class Solution {
        public int divide(int dividend, int divisor) {
            if (dividend == -2147483648 && divisor == -1) return 2147483647;
            int flag = 1;
            int ans = 0;
            if (dividend == 0) return 0;
            if (divisor == 1) return dividend;
            if (divisor == -1) return -dividend;
    
            long long_dividend = dividend;
            long long_divisor = divisor;
    
    
            if (long_dividend < 0 && divisor < 0) {
                long_dividend = -long_dividend;
                long_divisor = -long_divisor;
            } else if (long_dividend < 0 || long_divisor < 0) {
                flag = -1;
                long_dividend = Math.abs(long_dividend);
                long_divisor = Math.abs(long_divisor);
            }
    
            if (long_dividend < long_divisor) return 0;
    
            int k = 1;
            long tmp = long_divisor;
            while (tmp << 1 < long_dividend && tmp << 1 > 0) {
                tmp <<= 1;
                k <<= 1;
            }
            ans += k;
            long_dividend -= tmp;
    
            while (long_dividend >= long_divisor) {
                while (tmp > long_dividend) {
                    k >>= 1;
                    tmp >>= 1;
                }
                long_dividend -= tmp;
                ans += k;
            }
    
            return flag * ans;
        }
    }
    

    参考:https://blog.csdn.net/linhuanmars/article/details/20024907

  • 相关阅读:
    Java基础--第二十六天
    Java基础--第二十五天
    Java基础--第二十四天
    Java基础--第二十三天
    Java基础--第二十二天
    Java基础--第二十一天
    Java基础--第二十天
    Java基础--第十九天
    Java基础总结--待续
    docker学习笔记
  • 原文地址:https://www.cnblogs.com/acbingo/p/9268399.html
Copyright © 2011-2022 走看看