hello!今天我們來看一道演算法題!!!
在線OJ鏈接

給定兩個數,不做任何比較,回傳最大值,
分析:我們都知道1乘以任何數,得到的是它本身;0乘以任何數都是得0,根據這個性質啊,我們就能夠做出一些事情來,題目既然給了兩個數,我們將兩個數相減,假設被減數是a,減數是b,a-b肯定會得到一個正數或者負數,如果是正數,說明a比較大,反之就是b比較大,
然后我們就將這個結果進行處理,如果是負數,我們就讓他等于0;如果是正數,我們就讓他等于1,再將這1或者0,去乘以a或者b,肯定有一個得到他本身,另外一個得到0,二者相加作為結果回傳即可,代碼如下:
public int getMax1(int a, int b) {
int c = a - b; //得到差值,根據差值的正負判斷大小
int scA = sign(c); //判斷差值的正負,正數回傳1,負數回傳0
int scB = flip(scA); //scA和scB取相反
return scA * a + scB * b; //scA和scB,肯定有一個是0,有一個是1
}
private int sign(int n) {
return flip((n >> 31) & 1); //拿到n的符號位,根據符號位判斷正負
}
private int flip(int n) {
return n ^ 1; //如果n是1,就回傳0,如果n是0,就回傳1,
}
如上代碼,就是初級版的代碼,能夠解決一般的數值問題,但是有一個問題就是,a-b溢位怎么辦???溢位的話,肯定是會影響到后續的判斷的,
我們先想一想為什么會溢位???
溢位的情況,只能是a和b兩個數不同號,且數值相對比較大的時候,才會產生溢位,a和b同號的話,是不可能產生溢位的,如果同號,解決方案就是上面的代碼;問題就在于不同號的情況,所以我們先判斷一下a和b是否同號,然后再做處理,
public int getMax2(int a, int b) {
int c = a - b;
int scA = sign(a);
int scB = sign(b); //得到a和b的正負情況
int scC = sign(c);
int difSab = scA ^ scB; //相同為0,相異為1;判斷是否同號
int sameSab = flip(difSab); //difSab和sameSab,一個是1,一個是0
//如果同號,difSab就是0,sameSab就是1
//如果不同號,difSab就是1,sameSab就是0
int returnA = sameSab * scC + difSab * scA;
int returnB = flip(returnA);
return returnA * a + returnB * b;
}
解釋:重點就在于第12行的代碼,我們來看
- 如果a和b同號的話,說明a-b不會溢位,sameSab等于1,此時我們只需要看scC的正負情況,來判斷大小,
sameSab * scC - 如果a和b不同號的話,difSab等于1,此時只需判斷scA或者scB的正負情況即可,
difSab * scA
最后returnA和returnB,肯定有一個是0,有一個是1,二者互斥,最后相乘,肯定是要么回傳a的值,要么回傳b的值,
好啦,本期更新就到此結束啦!歡迎評論區留言!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/306292.html
標籤:其他
上一篇:一萬五千字詳解分治法(帶你用分治法思想優化程式,計算降低復雜演算法的時間復雜度)
下一篇:提高代碼速度的“正確姿勢”
