摘要:很容易想到,我們每次用被除數減去除數,進行減法的次數就是最終結果。這道題的采取了一種類似二分查找的思想。除了這些,這道題還要注意一些邊界情況的判斷,例如除數或被除數為,值溢出等。
題目詳情
Divide two integers without using multiplication, division and mod operator.想法
If it is overflow, return MAX_INT.題目要求我們在不借助乘法運算、除法運算和模運算的基礎上,求出輸入的兩個整數相除的結果。如果溢出,那么返回MAX_INT。其中第一個參數是被除數,第二個參數是除數。
這道題既然不能借助乘、除、模三種運算,我們只能運用加減法求結果。
很容易想到,我們每次用被除數減去除數,進行減法的次數就是最終結果。但是這種方法在遇到被除數很大,而除數很小的情況時,運算時間太長,會導致超時。
這道題的采取了一種類似‘二分查找’的思想。對于每一次運算,我們要盡可能找出除數的倍數n,使得n倍的除數盡可能接近被除數的大小。
如何找到這個倍數n呢?我們每次將除數翻倍,倍數為1,2,4,8,16...直到除數的n倍比被除數大。
這個時候我們就用被除數減去n倍的除數,繼續這樣計算下去。
最后我們得到的所有倍數的和,就是最后的答案。
除了這些,這道題還要注意一些邊界情況的判斷,例如除數或被除數為0,值溢出等。
解法public int divide(int dividend, int divisor) { boolean isPositive = true; if((dividend < 0 && divisor >0) || (dividend > 0 && divisor < 0)){ isPositive = false; } long ldividend = Math.abs((long)dividend); long ldivisor = Math.abs((long)divisor); if(ldivisor == 0)return Integer.MAX_VALUE; if(ldividend == 0)return 0; long lans = ldivide(ldividend, ldivisor); int ans; if (lans > Integer.MAX_VALUE){ ans = (isPositive)? Integer.MAX_VALUE : Integer.MIN_VALUE; } else { ans = (isPositive) ? (int)lans : -(int)lans; } return ans; } private long ldivide(long ldividend, long ldivisor) { if (ldividend < ldivisor) return 0; long sum = ldivisor; long multiple = 1; while ((sum+sum) <= ldividend) { sum += sum; multiple += multiple; } return multiple + ldivide(ldividend - sum, ldivisor); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68841.html
Problem 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 divisi...
摘要:題目解析用加減法實現除法用減法,每次累加被減部分,累加商,以一個固定的倍數遞增坑注意循環的跳出便捷,的情況要注意。應用累加思想,可以用在提速上,效率提高如果,則是負的,則是正的 題目解析: 用加減法實現除法 用減法,每次累加被減部分,累加商, 以一個固定的倍數遞增 坑: 注意 while循環的跳出便捷,= 的情況要注意。應用:累加思想,可以用在提速上,效率提高 Given two ...
摘要:題目要求在不使用乘法,除法和求余操作的情況下,計算兩個整數相除的結果。如果溢出了,則返回最大值。在這里核心思路是使用逆向二分法和遞歸的思路來進行計算。在這里我們使用取值范圍更廣的來處理數值溢出的場景。 題目要求 Divide two integers without using multiplication, division and mod operator. If it is o...
摘要:上篇文章寫了以我自己的思路來解決這個問題,但是運行時間過長,看了上的高效寫法是使用位運算的解法,當初我自己寫這個問題是也想到了可以用位運算快一點,但是因為基礎差,對位運算的掌握不牢靠,還是選擇使用了減法的思路,在此將上高效解法做一個思路分析 上篇文章寫了以我自己的思路來解決這個問題,但是運行時間過長,看了leetcode 上的高效寫法是使用位運算的解法,當初我自己寫這個問題是也想到了可...
摘要:位操作法復雜度時間空間思路我們設想,本來應該的得到余,那么如果我們把忽略余數后分解一下,,也就是,也就是把商分解為,所以商的二進制是。我們可以不斷的將乘的一次方,二次方,等等,直到找到最大那個次方,在這里是的四次方。 Divide Two Integers Divide two integers without using multiplication, division and m...
閱讀 1790·2021-11-24 10:21
閱讀 1202·2021-09-22 15:25
閱讀 3165·2019-08-30 15:55
閱讀 704·2019-08-30 15:54
閱讀 3456·2019-08-30 14:20
閱讀 1653·2019-08-30 14:06
閱讀 635·2019-08-30 13:11
閱讀 3135·2019-08-29 16:43