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

  • 相关阅读:
    9、 docker容器数据卷
    第十八章 MySQL数据库优化
    第十七章 MySQL的VIP漂移和Atlas
    第十六章 MHA高可用(续)
    第一章 shell基础
    第十五章 MHA高可用
    第十四章 MySQL的各种主从
    第十三章 MySQL的主从复制
    第十二章 MySQL的恢复与备份
    第十一章 MySQL日志详解
  • 原文地址:https://www.cnblogs.com/acbingo/p/9268399.html
Copyright © 2011-2022 走看看