zoukankan      html  css  js  c++  java
  • [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 }
  • 相关阅读:
    notes: the architecture of GDB
    How systems researchers build systems
    spark1.1.0源码阅读-executor
    spark1.1.0源码阅读-taskScheduler
    spark1.1.0源码阅读-dagscheduler and stage
    akka简单示例-2
    环境安装与项目配置
    安装zsh
    linux mysql 密码修改
    django-debug-toolbar 安装及配置 django性能监控及调试
  • 原文地址:https://www.cnblogs.com/liuliu5151/p/9810665.html
Copyright © 2011-2022 走看看