一道面試題 用多種方法實現兩個數的交換

2021-09-08 03:48:57 字數 2952 閱讀 5249

很多程式經常使用的最普通,比較常見的,也是比較簡單的乙個演算法

1、普通方法,借助乙個額外記憶體變數實現交換:

老掉牙的套路

2、額外記憶體方法,做成函式

#include using

namespace

std;

void swap(int, int

);int main(int argc, const

char *ar**)

void swap(int a, int

b)

a = 100 b = 200a = 100 b = 200program ended with exit code: 0

沒有發生改變,不起作用,還是老生常談了。因為傳遞的是引數的拷貝,交換的是拷貝,對原來的數,沒有任何影響。改正:

#include using

namespace

std;

void swap(int *, int *);

int main(int argc, const

char *ar**)

void swap(int *a, int *b)

a = 100 b = 200a = 200 b = 100program ended with exit code: 0

3、使用 c 語言裡的巨集定義(巨集函式)

複習筆記回憶:#define的用法

#include using

namespace

std;

#define swap(x, y, z) ((z) = (x), (x) = (y), (y) = (z))

int main(int argc, const

char *ar**)

a = 10 b = 200a = 200 b = 10program ended with exit code: 0

4、使用 c++獨有的引用

#include using

namespace

std;

void swap(int &, int &);

int main(int argc, const

char *ar**)

void swap(int &a, int &b)

不使用額外記憶體的方法,數學方法

不開闢新的記憶體變數實現交換(阿里巴巴的面試題,有時候為了追求機器的高效能,高效率,節約記憶體,一般用這種算術技巧,加減法可以,乘除法也可以,使用位操作也可以)

5、算術運算方法

#include using

namespace

std;

int main(void

)

a = 100 b = 200a = 200 b = 100program ended with exit code: 0

同樣乘除也可以實現,其實就是小學生的算術,只是想不到而已。

a = a *b;

b = a /b;

a = a /b;

6、位運算方法

相關複習c 語言的位運算子複習

異或運算有這樣乙個性質:

a ^ b ^ a;
也就是 x 異或 y 再異或 x,最後的結果是 y(中間的變數被提出)

例如:a=3,即11(2);b=4,即100(2)。

想將a和b的值互換,可以用以下賦值語句實現:

a=a∧b;

b=b∧a;//相當於b = b ^ a ^ b;最後把 a 提出,給了 b

a=a∧b;//相當於,a = a ^ b ^ a;,最後把 b 提出,給了a

a=011(2)(∧)b=100(2)

a=111(2)(a∧b的結果,a已變成7)(∧)b=100(2)

b=011(2)(b∧a的結果,b已變成3)(∧)a=111(2)

a=100(2)(a∧b的結果,a已變成4)

等效於以下兩步:

① 執行前兩個賦值語句:「a=a∧b;」和「b=b∧a;」相當於b=b∧(a∧b)。

② 再執行第三個賦值語句: a=a∧b。由於a的值等於(a∧b),b的值等於(b∧a∧b),

因此,相當於a=a∧b∧b∧a∧b,即a的值等於a∧a∧b∧b∧b,等於b。不推薦這樣寫,也不推薦在專案中使用!

c 語言的一條語句中,最好是,乙個變數的值只允許改變一次,像x = x++ 這種**都是未定義行為。在c語言裡沒有哪條規則保證以上寫法是永遠正確的。

另外,用異或交換變數既不會加快執行速度(反而更慢,六讀三寫加三次異或),也不會節省空間(中間變數tmp 通常會用暫存器,而不是記憶體空間儲存)。

這個技巧的意義完全在於應付**的面試,知道就行了,絕對不要放在產品**中。所以說這只是「面試技巧」。

補充其他性質:

1、交換律

2、結合律(即(a^b)^c == a^(b^c))

3、對於任何數x,都有x^x=0,x^0=x

4、自反性 a xor b xor b = a xor  0 = a

一道面試題 換錢的方法數

文章首發於 guanngxu 的個人部落格 動態規劃演算法優化例項 如何求解換錢的方法數 寫在前面 這是我的人生 面遇到的乙個面試題,是在去哪兒網二面遇到的,那時非常的緊張,還沒有複習,所以第一次面試理所應當的掛了。文章對問題進行逐步的由簡到難進行優化,基本上是 看懂 才能理解,也為類似問題提供了基...

c語言 多種方法實現兩個數的交換

交換兩個數的內容是c語言中常見的問題,所以在此總結一下我所學到的幾種方法。首先,舉乙個例子,假設a 10,b 20.第一種方法,借助乙個臨時變數來進行儲存,這是最容易也是最直觀的方法。如下 int a,b,t a 10 b 20 printf a d b d a,b t a a b b t prin...

JS 陣列去重實現,一道面試題

今日去某公司面試web前端,本來對這個公司感覺一般,但是技術面試兩面一共從下午2 30到5 30,各種問題問,主要以js為主,頓時對這個公司有了好的印象,個人感覺面試的水平高最起碼表明乙個公司的態度。問的還算是很給力,都是一般不幾個常用到的,但是想一想確實還挺實用,有了這次思路,下次自己玩前端的時候...