1. 程式人生 > 其它 >integer 做除法_力扣(中等)29題——除法運算

integer 做除法_力扣(中等)29題——除法運算

技術標籤:integer 做除法

題目:

給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。返回被除數 dividend 除以除數 divisor 得到的商。

整數除法的結果應當截去(truncate)其小數部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

示例:

輸入: dividend = 10, divisor = 3

輸出: 3

解釋: 10/3 = truncate(3.33333..) = truncate(3) = 3

力扣的這道題說實話哈,如果呼叫一些類庫,直接用除法解決,其實挺簡單的,要說難點也就是邊界處理的問題了,結果,或則引數可能存在整數越界的行為,做一定的處理也就可以了。

這道題其實並不是考我們使用常規的除法去解決問題,且題目中也要求我們不能使用乘法、除法以及取模運算。

Q那麼這道題我們該如何去解決呢?A

寸山結合自身的想法以及大神們的解題思路,該道題可以使用位運算或者樸素演算法,即用遞迴快速找到結果。

5e4f9f42af0188ed6c83fb3e56b32ee7.gif

解題演算法

class Solution {    //樸素演算法,最快匹配結果    //時間複雜度最壞O(n)    //空間複雜度O(n),呼叫遞迴棧的空間複雜度    public int divide(int dividend, int divisor) {        //被除數為0,無意義,結果返回0         if(dividend==0) return 0;         //除數為1,結果為被除數的值,為了剪枝         if(divisor==1) return dividend;         //同樣為了剪枝,當除數為1時,如果被除數大於最小整數,則為被除數的相反數,否則為最大整數         if(divisor==-1){             return dividend> Integer.MIN_VALUE? -dividend:Integer.MAX_VALUE;         }         long a = dividend;         long b = divisor;         //記錄符號位,>0 表示為正數,否則為負數         int sign = 1;         if(a*b<0) sign = -1;                  a = a>0? a:-a;         b = b>0? b:-b;         //獲取結果         long ans = div(a,b);         //如果符號位為正,則看ans是否大於最大整數,若大於則返回最大整數,否則返回ans,但是由於函式返回型別為int,所以需要強制轉換         if(sign>0) return ans>Integer.MAX_VALUE?Integer.MAX_VALUE:(int)ans;         //否則,說明符號位為負,返回ans的相反數,同樣需要強轉         return -(int)ans;     }    long div(long a, long b){        //被除數小於除數的話,返回0,遞迴終止條件        if(areturn
//記錄2*tb<=a的次數 long count = 1; //當2*tb>a時,我們需要回溯計算 a-tb的count,所以不能用b操作,操作tb來代替 long tb = b; //div方法核心,當2*tb<=a時,表示最後的ans肯定大於現在的count,需要繼續計算,當不滿足時跳出迴圈 while((tb+tb)<=a){ count += count; tb += tb; } //此時的count只是結果的一部分,我們還需要計算將a-tb作為被除數的count,直到a-tb
return count+div(a-tb,b); }}

我們就是先對邊界進行一定的剪枝處理,比如當除數為1時,我們不需要進行遞迴計算,直接返回被除數就可以了。對於一般情況,我們就遞迴快速計算最後結果。主要的思路就是讓除數翻倍,看是否小於被除數,如果為true,則計數器和tb都翻倍,用中介tb來代替直接對b進行操作,因為,後續還要使用原始的b(除數)。當不滿足於while迴圈後,返回結果,結果表面上看是由兩部分組成,一部分是當前的count,另一部分是繼續呼叫div方法,將a-tb作為被除數,b作為除數,繼續計算count,就這樣不斷進行,直到a

該題思路眾多,但是就寸山而言這種最好理解,感興趣的小夥伴可以多嘗試幾種思路。寸山在這裡再推薦一種思路,就是位運算,因為,在很多面試過程中也經常被問到位運算方面的演算法題。

☆ END ☆