力扣29. 两数相除题解

原题链接29. 两数相除 - 力扣(LeetCode)

主要不能用乘除取余,于是用位运算代替:

Java题解

java 复制代码
class Solution {
    public int divide(int dividend, int divisor) {
        //全都转为负数计算, 避免溢出, flag记录结果的符号
        int flag = 1;
        if(dividend < 0) {
            flag = -flag;
        }else {
            dividend = -dividend;
        }

        if(divisor < 0) {
            flag = -flag;
        }else {
            divisor = -divisor;
        }

        int div = divisor;

        // -(用多少个负数的divisor)
        int ans = 0;

        while(div >= dividend) {
            // 记录这次用了多少个divisor的负数 (避免溢出)
            int numDiv = -1;

            // 如果div乘二后不溢出并且小于被除数剩下的值则乘二,本次用的divisor数量也乘二
            while((div << 1) < div && (div << 1) >= dividend) {
                numDiv = numDiv << 1;
                div = div << 1;
            }

            // 被除数减去 负数的divisor * (-numDiv)
            dividend -= div;
            // 增加用的divisor数量
            ans += numDiv;
            // 重置除数
            div = divisor;
        }

        // 两个三十二位整数合法相除,只有可能正溢出,不可能负溢出,判断特殊条件
        if(ans == Integer.MIN_VALUE && flag == 1) {
            return Integer.MAX_VALUE;
        }else if(flag == 1) { // ans为不带符号的商的负数
            return -ans;
        }else {
            return ans;
        }
    }
}

记录下比较有意思的点,我原来返回结果写的是 -flag * ans,因为担心在ans为Integer.MIN_VALUE,flag为-1时写(flag * (-ans))会溢出,但是试了下 -1 * (-(-2147483648)) 的结果居然是 -2147483648,并没有想象中的奇怪值。实际上它的补码10000000 00000000 00000000 00000000, 取负数以后仍然是10000000 00000000 00000000 00000000, 先按位取反得到:01111111 11111111 11111111 11111111, 加一10000000 00000000 00000000 00000000,又变回原来的了,java是静默溢出,-1 * (-(-2147483648))会溢出两次,但是结果仍不变

相关推荐
2601_962071574 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491115 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
淡海水5 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
leobertlan5 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
Tisfy6 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
乐迪信息7 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
zww89491117 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
黑马程序员毕设8 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳8 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
心抵鹊9 小时前
归并排序之翻转对(hard)
数据结构·算法