1. 程式人生 > >面試題——a、b交換與比較

面試題——a、b交換與比較

面試題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;

參與運算數仍以補碼形式出現,