ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

千问 LeetCode 29. 两数相除 Java实现

2026/8/31 5:20:47 拓冰建站 浏览量
千问    LeetCode 29. 两数相除 Java实现 LeetCode 29. 两数相除的核心约束是不能用乘法、除法和取模最优解法是倍增法快速幂思想时间复杂度 O(log²n)。核心思路统一转负数处理避免 Integer.MIN_VALUE 转正溢出倍增逼近每次将除数翻倍 1快速逼近被除数O(log n) 次操作代替 O(n) 次减法符号单独判断异号为负同号为正推荐解法倍增法class Solution {public int divide(int dividend, int divisor) {// 唯一溢出情况if (dividend Integer.MIN_VALUE divisor -1) {return Integer.MAX_VALUE;}// 确定符号异号为负 boolean negative (dividend 0) ^ (divisor 0); // 统一转 long 取绝对值避免 MIN_VALUE 溢出 long dvd Math.abs((long) dividend); long dvs Math.abs((long) divisor); int quotient 0; while (dvd dvs) { long temp dvs; int multiple 1; // 不断翻倍直到再翻就超过被除数 while (temp 1 dvd) { temp 1; multiple 1; } dvd - temp; quotient multiple; } return negative ? -quotient : quotient; }}复杂度项目 值时间复杂度 O(log²n)空间复杂度 O(1)关键细节溢出特判MIN_VALUE / -1 2147483648超出 int 范围直接返回 MAX_VALUE统一转负数/longInteger.MIN_VALUE 取绝对值会溢出所以先转 long 再取绝对值倍增法核心内层循环不断将 temp 翻倍找到不超过 dvd 的最大倍增除数减去它并累加倍数。本质是快速幂的逆向思维符号判断(dividend 0) ^ (divisor 0) 用异或判断异号执行过程示例dividend 10, divisor 3第1轮temp3→6→12(超了)用6dvd10-64quotient2第2轮temp3→6(超了)用3dvd4-31quotient3结束返回 3面试重点讲清楚为什么统一转负数/long和倍增法如何加速两个点即可。需要我帮你整理一下位运算在算法题中的高频考点吗比如快速幂、状态压缩这类套路。