摘要:題目要求在不使用乘法,除法和求余操作的情況下,計(jì)算兩個(gè)整數(shù)相除的結(jié)果。如果溢出了,則返回最大值。在這里核心思路是使用逆向二分法和遞歸的思路來(lái)進(jìn)行計(jì)算。在這里我們使用取值范圍更廣的來(lái)處理數(shù)值溢出的場(chǎng)景。
題目要求
Divide two integers without using multiplication, division and mod operator. If it is overflow, return MAX_INT.
在不使用乘法,除法和求余操作的情況下,計(jì)算兩個(gè)整數(shù)相除的結(jié)果。如果溢出了,則返回最大值。
在這里核心思路是使用逆向二分法和遞歸的思路來(lái)進(jìn)行計(jì)算。其中一個(gè)難點(diǎn)在于如何處理溢出的情況。在這里我們使用取值范圍更廣的long來(lái)處理數(shù)值溢出的場(chǎng)景。其次我們將所有的正負(fù)值運(yùn)算從遞歸中提取出來(lái),直接判斷結(jié)果的正負(fù)情況并直接在返回最后結(jié)果時(shí)添上正負(fù)值
解題代碼public int divide(int dividend, int divisor) { //判斷最終結(jié)果的正負(fù)性 boolean isPositive = true; if((dividend<0&&divisor>0) || (dividend>0&&divisor<0)){ isPositive = false; } //判斷結(jié)束后全部當(dāng)做正數(shù)進(jìn)行操作 //使用long解決數(shù)值溢出情況 long ldividend = Math.abs((long)dividend); long ldivisor = Math.abs((long)divisor); if(ldivisor==0) return Integer.MAX_VALUE; if(ldividend==0 || ldividendInteger.MAX_VALUE){ return isPositive? Integer.MAX_VALUE : Integer.MIN_VALUE; } return (int)(isPositive? result : -result); } public long divide(long ldividend, long ldivisor){ if(ldividend = (sum+sum)){ sum += sum; result += result; } return result + divide(ldividend-sum, ldivisor); }
想要了解更多開(kāi)發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69960.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...
摘要:題目解析用加減法實(shí)現(xiàn)除法用減法,每次累加被減部分,累加商,以一個(gè)固定的倍數(shù)遞增坑注意循環(huán)的跳出便捷,的情況要注意。應(yīng)用累加思想,可以用在提速上,效率提高如果,則是負(fù)的,則是正的 題目解析: 用加減法實(shí)現(xiàn)除法 用減法,每次累加被減部分,累加商, 以一個(gè)固定的倍數(shù)遞增 坑: 注意 while循環(huán)的跳出便捷,= 的情況要注意。應(yīng)用:累加思想,可以用在提速上,效率提高 Given two ...
摘要:很容易想到,我們每次用被除數(shù)減去除數(shù),進(jìn)行減法的次數(shù)就是最終結(jié)果。這道題的采取了一種類似二分查找的思想。除了這些,這道題還要注意一些邊界情況的判斷,例如除數(shù)或被除數(shù)為,值溢出等。 題目詳情 Divide two integers without using multiplication, division and mod operator.If it is overflow, retu...
摘要:上篇文章寫了以我自己的思路來(lái)解決這個(gè)問(wèn)題,但是運(yùn)行時(shí)間過(guò)長(zhǎng),看了上的高效寫法是使用位運(yùn)算的解法,當(dāng)初我自己寫這個(gè)問(wèn)題是也想到了可以用位運(yùn)算快一點(diǎn),但是因?yàn)榛A(chǔ)差,對(duì)位運(yùn)算的掌握不牢靠,還是選擇使用了減法的思路,在此將上高效解法做一個(gè)思路分析 上篇文章寫了以我自己的思路來(lái)解決這個(gè)問(wèn)題,但是運(yùn)行時(shí)間過(guò)長(zhǎng),看了leetcode 上的高效寫法是使用位運(yùn)算的解法,當(dāng)初我自己寫這個(gè)問(wèn)題是也想到了可...
摘要:位操作法復(fù)雜度時(shí)間空間思路我們?cè)O(shè)想,本來(lái)應(yīng)該的得到余,那么如果我們把忽略余數(shù)后分解一下,,也就是,也就是把商分解為,所以商的二進(jìn)制是。我們可以不斷的將乘的一次方,二次方,等等,直到找到最大那個(gè)次方,在這里是的四次方。 Divide Two Integers Divide two integers without using multiplication, division and m...
閱讀 1896·2021-11-11 16:55
閱讀 2106·2021-10-08 10:13
閱讀 755·2019-08-30 11:01
閱讀 2166·2019-08-29 13:19
閱讀 3293·2019-08-28 18:18
閱讀 2631·2019-08-26 13:26
閱讀 588·2019-08-26 11:40
閱讀 1879·2019-08-23 17:17