剑指offer 整数的除法Java
力扣题目链接
遇到代替乘除或者优化乘除,首先考虑位运算
这道题需要注意Integer.MIN_VALUE
直接用减法来替代会超出时间限制
class Solution {
public int divide(int a, int b) {
if (b == 0)
return 0;
if (a == Integer.MIN_VALUE){
if (b == -1) return Integer.MAX_VALUE;
if (b == 1) return Integer.MIN_VALUE;
}
if (b == Integer.MIN_VALUE){
if (a == Integer.MIN_VALUE) return 1;
else return 0;
}
int sign = -1;//判断结果正负
//a,b均设为负数,防止越界
if (a > 0) {
sign = -sign;
a = -a;
}
if (b > 0) {
sign = -sign;
b = -b;
}
int res = 0;
while (a <= b){
a -= b;
++res;
}
if (sign > 0)
res = -res;
return res;
}
}
位运算操作符的优先级大于判断符
class Solution {
public int divide(int a, int b) {
//特殊情况,当被除数为Integer.MIN_VALUE,除数为-1时,直接返回Integer.MAX_VALUE
if (a == Integer.MIN_VALUE && b == -1) {
return Integer.MAX_VALUE;
}
//判断除数和被除数是否同号,同号为true,返回正数,异号反之
boolean flag = false;
if ((a<0 && b<0) || (a>0 && b>0)) {
flag = true;
}
//转为绝对值
long dividend = Math.abs((long) a);
long divisor = Math.abs((long) b);
//如果被除数小于除数直接返回零
if (dividend < divisor) {
return 0;
}
//计算 结果的绝对值
int result = 0;
int shift = 31;
while (dividend >= divisor) {
//当被除数小于除数乘以2的31次方
while (dividend < divisor << shift) {
//除数少乘一个二
shift--;
}
//当被除数为15,除数为2时,跳出里边while循环时,shift为2
//15 -= 2<<2 ---->7
//7 -=2<<1 ---->3
//3 -=2<<0 ---->1
dividend -= divisor << shift;
//4+2+1
result += 1 << shift;
}
//返回判断完正负号的答案
return flag ? result : -result;
}
}
本文来自博客园,作者:蹇爱黄,转载请注明原文链接:https://www.cnblogs.com/jianjiana/p/15860999.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?