• [leetcode]29. Divide Two Integers 两整数相除


    Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.

    Return the quotient after dividing dividend by divisor.

    The integer division should truncate toward zero.

    Example 1:

    Input: dividend = 10, divisor = 3
    Output: 3

    Example 2:

    Input: dividend = 7, divisor = -3
    Output: -2

    Note:

    • Both dividend and divisor will be 32-bit signed integers.
    • The divisor will never be 0.
    • Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231,  231− 1]. For the purpose of this problem, assume that your function returns 231 − 1 when the division result overflows.

    题目

    不准乘除,不准膜。

    思路

    那剩下的还能用加减、位运算

    代码

     1 // Divide Two Integers
     2 // 时间复杂度O(logn),空间复杂度O(1)
     3 public class Solution {
     4     public int divide(int dividend, int divisor) {
     5         if(dividend == 0) return 0;
     6         if (divisor == 0) return Integer.MAX_VALUE;
     7 
     8         // 当 dividend = INT_MIN,divisor = -1时,结果会溢出
     9         if (dividend == Integer.MIN_VALUE) {
    10             if (divisor == -1) return Integer.MAX_VALUE;
    11             else if (divisor < 0)
    12                 return 1 + divide(dividend - divisor, divisor);
    13             else
    14                 return - 1 + divide((dividend + divisor), divisor);
    15         }
    16         if(divisor == Integer.MIN_VALUE){
    17             return dividend == divisor ? 1 : 0;
    18         }
    19 
    20         int a = dividend > 0 ? dividend : -dividend;
    21         int b = divisor > 0 ? divisor : -divisor;
    22 
    23         int result = 0;
    24         while (a >= b) {
    25             int c = b;
    26             for (int i = 0; a >= c;) {
    27                 a -= c;
    28                 result += 1 << i;
    29                 if (c < Integer.MAX_VALUE / 2) { // prevent overflow
    30                     ++i;
    31                     c <<= 1;
    32                 }
    33             }
    34         }
    35 
    36         return ((dividend^divisor) >> 31) != 0 ? (-result) : (result);
    37     }
    38 }
  • 相关阅读:
    Metasploit笔记
    Spark在Eclipse运行的demo
    CSS实现网页背景图片自适应全屏
    CSS-鼠标移入一个标签改变另外一个标签的样式
    CSS-简单动画效果
    CSS-div重合设置
    MouduleList 和 Sequential 区别
    35. 搜索插入位置(二分查找易错总结)
    100. 相同的树
    27. 移除元素
  • 原文地址:https://www.cnblogs.com/liuliu5151/p/9810665.html
Copyright © 2020-2023  润新知