力扣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))会溢出两次,但是结果仍不变

相关推荐
后台模板学习4 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one4 小时前
算法--构造
java·数据结构·算法
SL_staff4 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
其实防守也摸鱼4 小时前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php
SL_staff5 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
Mikko75 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
.Bryce.5 小时前
从零到一开发技术名词大全:从需求分析到 AI Agent 工程
java·网络·人工智能·agent·需求分析·agent评测
小超人诞生日记5 小时前
C++ 智能指针的使用及其原理详解
c++·算法
SL_staff6 小时前
JVS-APS的7个刚性约束设计:从无限产能幻觉到可执行排产的工程实践
java·spring cloud·全栈