网站首页 > java教程 正文
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333..) = truncate(3) = 3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = truncate(-2.33333..) = -2
提示:
- 被除数和除数均为 32 位有符号整数。
- 除数不为 0。
- 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [?2^31, 2^31 ? 1]。本题中,如果除法结果溢出,则返回 2^31 ? 1。
package leetcode;
import java.util.ArrayList;
import java.util.List;
public class Divide_29 {
public int divide(int dividend, int divisor) {
int res = 0;
if (dividend == 0) {
return 0;
}
boolean isPositive = false;
if (dividend > 0) {
isPositive = true;
}
boolean isSame = false;
if (dividend > 0 && divisor > 0 || dividend < 0 && divisor < 0) {
isSame = true;
}
int now = 0;
if (isSame) {
now += divisor;
} else {
now -= divisor;
}
List<Integer> doubles = new ArrayList<>();
doubles.add(now);
while (isPositive && dividend >= now ||
!isPositive && dividend <= now) {
if (now > 0 && now > Integer.MAX_VALUE - now ||
now < 0 && now < Integer.MIN_VALUE - now) {
break;
}
now += now;
doubles.add(now);
}
int value = 0;
for (int i = doubles.size() - 1; i >= 0; i--) {
if (isPositive && value <= dividend - doubles.get(i)
|| !isPositive && value >= dividend - doubles.get(i)) {
value = value + doubles.get(i);
if (isSame) {
if (i == 31) {
res = Integer.MAX_VALUE;
} else {
res += 1 << i;
}
} else {
res += -1 << i;
}
if (value == dividend) {
return res;
}
}
}
return res;
}
public static void main(String[] args) {
Divide_29 divide_29 = new Divide_29();
int divide = divide_29.divide(2147483647, 3);
System.out.println(divide);
}
}
猜你喜欢
- 2024-10-11 Java的“异常”(JAVA的异常体系)
- 2024-10-11 第四讲《JAVA基础之运算符》,小妙招教你速记、速填坑
- 2024-10-11 容易让人忽视的,java高精度运算(java高精度转低精度的原则)
- 2024-10-11 提高千倍效率的 Java 代码小技巧(java提高班)
- 2024-10-11 一文搞明白java中的位运算、补码、反码、原码
- 2024-10-11 十五、Java运算符-赋值运算符与instanceof运算符
- 2024-10-11 一文掌握Java二、八、十六进制运算实现原理
- 2024-10-11 计算机进制转换(计算机进制转换教程)
- 2024-10-11 Java基础之try catch finally的原理
- 2024-10-11 LeetCode算法第29题:两数相除(计算两数相除并输出结果)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)