面試題——a、b交換與比較
阿新 • • 發佈:2019-01-09
面試題1:
有兩個變數a和b,不用“if”,"?"、"switch"或其他判斷語句,找出兩個數中間比較大的
方案一:
int max = ((a+b)+abs(a-b))/2
注:abs()--求絕對值
方案二:
int c = a-b;
char * strs[2] = {"a large","b large"};
c = unsigned(c)>>(sizeof(int)*8-1);
面試題2:給三個整數a、b、c, 函式實現取三個數的中間數,不可以用sort ,整數操作儘可能少
程式碼如下:
inline int max(int a, int b) { return a>=b?a:b;}
inline int min(int a, int b) { return a<=b?a:b;}
inline int medium (int a,int b,int c)
{
int t1 =max(a,b);
int t2 = max(b,c);
int t3 = max(a, c);
return min (t1,min(t2,t3));
}
面試題3:如何將a、b的值進行交換,並且不使用任何中間變數?
解析:簡而言之,用異或語句比較容易,不用擔心越界問題
如果採用:
a=a+b;
b=a-b;
a=a-b;
這樣做的缺點就是如果a、b都是比較大的兩個數,a=a+b就會越界
而採用:
a=a^b;
b=a^b;
a=a^b;
無需擔心越界問題,這樣就比較好
這樣做的原理是按位異或運算。按位異或運算“^”是雙目運算子。其功能是參與運算的兩個數個對應的二進位制位相異或,當對應的二進位制位相異時取1;
參與運算數仍以補碼形式出現,