# 劇透警告,沒寫過的勿觸 題目: > 編寫一個方法,找出兩個數字a和b中最大的那一個。不得使用if-else或其他比較運算符。 qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq q ...
劇透警告,沒寫過的勿觸
題目:
編寫一個方法,找出兩個數字a和b中最大的那一個。不得使用if-else或其他比較運算符。
qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq
qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq
qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq
qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq pwq qwq qwq qwq qwq qwq qwq qwq qwq qwq
qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq qwq
先上代碼:
class Solution {
public int maximum(int a, int b) {
int isNegative = (a / 2 - b / 2) >>> 31;
return ((1 - isNegative) * a) + (isNegative * b);
}
}
因為0乘任何數都是0,結果一個0一個1,就可以把乘積相加咯qwq
硬要說問題的話,小數不能使用>>> 31
的方式取1(好像是8+23的原因?),比如:0.2 - 0.8 == -0.6000000000000001
,解決方式的話可以使用isNegative = (isNegative * 2) | 1
來變回正整數。當然,題目的數據集都是整數,而且也恰巧差值都大於1(如果遇到差值為1的樣本,那就會報錯了),所以* 2
只是複原了這個方法/ 2
的結果。
加上優化寫了四個小時,嘗試了四種思路:
- 使用與、非、異或符號加位運算的數學運算思路
- 使用
try catch
和0不能被除的報錯 - 使用數組和布爾值實現減法器
- 最終方案,上面的代碼
當然前兩條已經嘗試無果了,位運算根本無法摘取出他們的最大值差異,所以就陷入了死迴圈;至於try catch
?開玩笑一樣的方法,直接不給過= =
然後是數組和布爾的,上代碼:
class Solution {
public int maximum(int a, int b) {
int[] res = new int[]{a, b};
return res[(a / 2 - b / 2) >>> 31];
}
}
也是從彙編減法器中迸發的想法,一瞬間醍醐灌頂。
然後呢,後面兩個解法差不多半小時全部寫完awa
後面兩個代碼的想法來自朋友寫的一個公式,產生了火花,感謝朱靜Think
的幫助:
圖裡內容抽象出來就是:
如果|a - b| + (b - a) = 0
,則說明a > b
,這很重要,是扭轉戰局的勝負手。