Advertisement
1988coder

Divide Two Integers

Sep 30th, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.19 KB | None | 0 0
  1. /*
  2. Solution using all int variables. Long is not used.
  3. Time Complexity = O(log n) -> where n is the dividend
  4. Search space is (dividend - divisor).. Every while loop we will reduce the search space by half.
  5. Space Complexity = O(1)
  6. */
  7. class Solution {
  8.     public int divide(int dividend, int divisor) {
  9.         if (divisor == 0) {
  10.             return Integer.MAX_VALUE;
  11.         }
  12.         if (divisor == 1) {
  13.             return dividend;
  14.         }
  15.         if (dividend == divisor) {
  16.             return 1;
  17.         }
  18.        
  19.         int intMinOverflow = 0;
  20.        
  21.         if (dividend == Integer.MIN_VALUE) {
  22.             if (divisor == -1) {
  23.                 return Integer.MAX_VALUE;
  24.             } else {
  25.                 intMinOverflow = 1;
  26.             }
  27.         }
  28.        
  29.         if (divisor == Integer.MIN_VALUE) {
  30.             return 0;
  31.         }
  32.         if (divisor == -1) {
  33.             return ~dividend + 1;
  34.         }
  35.        
  36.         int result = 0;
  37.         boolean resultSign = (dividend < 0) ^ (divisor < 0);
  38.        
  39.         int dividendAbs = Math.abs(dividend + intMinOverflow);
  40.         int divisorAbs = Math.abs(divisor);
  41.        
  42.         while (dividendAbs >= divisorAbs) {
  43.             int divisorTemp = divisorAbs;
  44.             int multiple = 1;
  45.             while (dividendAbs >= (divisorTemp << 1) && ((divisorTemp << 1) >> 1) == divisorTemp) {
  46.                 divisorTemp <<= 1;
  47.                 multiple <<= 1;
  48.             }
  49.             dividendAbs -= divisorTemp;
  50.             dividendAbs += intMinOverflow;
  51.             intMinOverflow = 0;
  52.             result += multiple;
  53.         }
  54.        
  55.         return resultSign ? ~result + 1 : result;
  56.     }
  57. }
  58.  
  59. /*
  60. In the following solution long is used to store the intermediate values.
  61. Time Complexity = O(log n) -> where n is the dividend
  62. Space Complexity = O(1)
  63. */
  64. // class Solution {
  65. //     public int divide(int dividend, int divisor) {
  66. //         if (divisor == 0) {
  67. //             return Integer.MAX_VALUE;
  68. //         }
  69. //         if (divisor == 1) {
  70. //             return dividend;
  71. //         }
  72.        
  73. //         if (dividend == Integer.MIN_VALUE) {
  74. //             if (divisor == -1) {
  75. //                 return Integer.MAX_VALUE;
  76. //             } else if (divisor == Integer.MIN_VALUE) {
  77. //                 return 1;
  78. //             }
  79. //         }
  80.        
  81. //         if (divisor == Integer.MIN_VALUE) {
  82. //             return 0;
  83. //         }
  84. //         if (divisor == -1) {
  85. //             return ~dividend + 1;
  86. //         }
  87.        
  88. //         int result = 0;
  89. //         boolean resultSign = (dividend < 0) ^ (divisor < 0);
  90.        
  91. //         long dividendAbs = Math.abs((long) dividend);
  92. //         long divisorAbs = Math.abs((long) divisor);
  93.        
  94. //         while (dividendAbs >= divisorAbs) {
  95. //             long divisorTemp = divisorAbs;
  96. //             long multiple = 1;
  97. //             while (dividendAbs >= (divisorTemp << 1)) {
  98. //                 divisorTemp <<= 1;
  99. //                 multiple <<= 1;
  100. //             }
  101. //             dividendAbs -= divisorTemp;
  102. //             result += multiple;
  103. //         }
  104.        
  105. //         return resultSign ? ~result + 1 : result;
  106. //     }
  107. // }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement