【LeetCode-面試演算法經典-Java實現】【029-Divide Two Integers(兩個整數相除)】,leetcode--java
【029-Divide Two Integers(兩個整數相除)】【LeetCode-面試演算法經典-Java實現】【所有題目目錄索引】原題
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
題目大意
不使用除法,乘法和取餘,求兩個整數的相除的結果,如果有溢出就返回最大的整數。
解題思路
任何一個整數可以表示成以2的冪為底的一組基的線性組合,即num=a_0*2^0+a_1*2^1+a_2*2^2+…+a_n*2^n。基於以上這個公式以及左移一位相當於乘以2,我們先讓除數左移直到大於被除數之前得到一個最大的基。然後接下來我們每次嘗試減去這個基,如果可以則結果增加加2^k,然後基繼續右移迭代,直到基為0為止。因為這個方法的迭代次數是按2的冪知道超過結果,所以時間複雜度為O(log(n))。
代碼實現
演算法實作類別
public class Solution { public int divide(int dividend, int divisor) { // 相除時溢出處理 if (divisor == 0 || dividend == Integer.MIN_VALUE && divisor == -1) { return Integer.MAX_VALUE; } // 求符號位 int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1; // 求絕對值,為防止溢出使用long long dvd = Math.abs((long) dividend); long dvs = Math.abs((long) divisor); // 記錄結果 int result = 0; // 被除數大於除數 while (dvd >= dvs) { // 記錄除數 long tmp = dvs; // 記錄商的大小 long mul = 1; while (dvd >= (tmp << 1)) { tmp <<= 1; mul <<= 1; } // 減去最接近dvd的dvs的指數倍的值(值為tmp) dvd -= tmp; // 修正結果 result += mul; } return result * sign; }}
評測結果
點擊圖片,滑鼠不釋放,拖動一段位置,釋放後在新的視窗中查看完整圖片。
特別說明
歡迎轉載,轉載請註明出處【http://blog.csdn.net/derrantcm/article/details/47052683】
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。