劍指 Offer II 001 整數除法

2022-09-19 17:21:07 字數 1121 閱讀 9573

為了方便描述,我們考慮a和b都為正數的情況,之後再考慮其他情況。

最直接的思路就是將b乙個乙個的累加,至到累加的結果超過了a,即可得到答案。以a=18,b=5為例,此過程如下圖所示:

這個作法通俗易懂,但效率不高,舉個極端例子,當a=2^31-1b=1時,要將b加2^31-1次才能算出結果。下面給出優化演算法。

在上述演算法中,我們每次給v加乙個b,事實上我們可以考慮每次讓v翻倍增加,也就是說,上圖中的v不是乙個b乙個b地增加,而是每次讓v=v+v。當v大於a時,我們將a更改為a-(v/2),並重複此操作,直到a小於b。那麼我們怎麼得到結果呢?注意到每次v大於a時,我們都可以得到v/2裡面包含有k個b,將k累計到結果裡面即可。如下圖所示:

上述過程我們考慮了a和b都是正數的情況,當兩個都為負數或者一正一負的時候,我們可以考慮將其都轉換為正數計算,然後根據負數的個數改變結果的正負號即可(即當a和b中有乙個為負數時,給結果加個負號),下面的情況也是必須要考慮的:

32位整數的範圍:最小值為-2^31=-2147483648,最大值為2^31-1=2147483647

① 當a為-2147483648時,將a變為正數計算會越出最大值,因此我們考慮將a和b均轉為負數計算,思路和兩個正數計算相同,不再贅述。

② 當a=-2147483648,b=-1時,計算結果為ret為2147483648,超過32位正數的最大值,此時直接返回2147483647即可。

class solution

a = a-v;

ret+=k;

}return negcount==1? -ret:ret; //當且僅當a和b有乙個為負數時,結果為負}}

劍指 Offer II 001 整數除法

難度 簡單 輸入2個int型整數,它們進行除法計算並返回商,要求不得使用乘號 除號 及求餘符號 當發生溢位時,返回最大的整數值。假設除數不為0。例如,輸入15和2,輸出15 2的結果,即7。這個題目限制我們不能使用乘號和除號進行運算。乙個直觀的解法是基於減法實現除法。例如,為了求得15 2的商,可以...

劍指Offer II 左旋轉字串

字串的左旋轉操作是把字串前面的若干個字元轉移到字串的尾部。請定義乙個函式實現字串左旋轉操作的功能。比如,輸入字串 abcdefg 和數字2,該函式將返回左旋轉兩位得到的結果 cdefgab 一行 沒什麼好說的,複習substr用法 形式 s.substr pos,n 解釋 返回乙個string,包含...

劍指Offer II 0 n 1中缺失的數字

乙個長度為n 1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0 n 1之內。在範圍0 n 1內的n個數字中有且只有乙個數字不在該陣列中,請找出這個數字。兩種思路都試一下,現在就能更明確力扣的判時就假的一批。二分法竟然比順序找還慢 重點說下二分法的思路 演算法解析 返回值 跳出時,變數 ...