1. 程式人生 > >面試官在“逗”你係列:不借助第三變數交換兩個變數值的方案你有幾種?

面試官在“逗”你係列:不借助第三變數交換兩個變數值的方案你有幾種?

引言

在我們學習程式設計之初,就學習過變數的賦值操作,同時也學習了將一個變數的值賦值給另外一個變數。對於交換兩個變數的值,很多童鞋都有解決方案。然鵝,對於面試官提出的不借助第三變數來交換兩個變數的值,你能想到幾種解決方案呢?

如果你只知道一種方案,請你認真看下去...
如果你知道兩種方案,那麼你可以來了解更多方案了...

一、最簡單的實現-最初的記憶

讓我們由淺入深,來了解交換變數值的最簡單、最初的解決方案:藉助於第三個變數

// 宣告變數a和b
let a = 5
let b = 4
// 1. 臨時將變數a的值賦值給變數tmp
let tmp = a
// 2. 將變數b的值賦值給a
a = b
// 3. 將變數a的值(tmp的值)賦值給b
b = tmp

console.log(a) // 4
console.log(b) // 5

so east!

二、不借助第三變數的實現-ES6版

面試官在聽到上面給出的解決方案後,微微一笑(腦海中閃現到:你以為就這麼簡單)說道,有其他解決方案嗎,不借助第三變數呢?

瞭解學習了JS ES6的陣列解構賦值的童鞋對此冷冷一笑,嘴角一撇,冷酷酷地說道:也可以使用ES6的陣列解構賦值來交換變數的值。

let a = 5;
let b = 4; // 請注意此位置的分號;是一定要存在的呀

// 陣列結構賦值,交換變數a,b的值
[a, b] = [b, a]

console.log(a) // 4
console.log(b) // 5

看到面試官的臉色似乎漸漸露出了滿意的神色,內心是不是有點兒竊喜。
如果此刻面試官又說道,還有沒有其他的解決方案,小朋友,你是不是有許多問號?

三、不借助第三變數的實現-終極版本一:單純數學運算

胡哥在這裡再次強調,這絕對不是一個考驗“智商”的答案,只是考驗了在程式設計的變通能力以及經驗問題,下面請看程式碼的實現。

let a = 5
let b = 4

// 接下來就是見證神奇的時刻,來,鏡頭請對準我。

// 二者之和
a = a + b
// 二者之和 - b的值,剩餘a的值賦值給變數b
b = a - b
// 此刻a還是二者之和,a - b此刻相當於二者之和 - 變數b(a的值),那麼此刻剩餘的就是變數b的值,賦值給a變數
a = a - b

// yes, we did!
console.log(a) // 4
console.log(b) // 5

如果此刻面試官再問出還有沒有其他的方案,此刻你會慌的一比呢,還是內心大喊“wc”呢

四、不借助第三變數的實現-終極版本二:位運算子^

不要怕,兄弟們,接下來給大家來分享第四種方式,位運算子 ^ 異或。在變數的運算中這個操作符有什麼作用呢?

異或運算子:

是執行位運算的,二進位制運算,參與變數運算的兩個變數要轉為二進位制進行運算。
如果相同二進位制位的值相同,則轉為0,否則轉為1.

那交換兩個變數的值具體程式碼是如何實現的呢?請看大螢幕,哦,不,請往下看。

let a = 5 // 0101
let b = 4 // 0100

// 按位異或運算
a = a ^ b // 0101 ^ 0100 ===> 0001,此時a的值為1
b = a ^ b // 0001 ^ 0100 ===> 0101,此時b的值為5
a = a ^ b // 0001 ^ 0101 ===> 0100,此時a的值為4

console.log(a) // 4
console.log(b) // 5

驚不驚喜,意不意外。。。

以上四種實現交換兩個變數值得方案你都掌握了嗎,如果掌握了,可以對面試官反手就是一個“吊打”了。
如果你有更多的解決交換兩個變數值的方案,歡迎留言交流呀!

後記

以上就是胡哥今天給大家分享的內容,喜歡的小夥伴記得點贊收藏呦,關注胡哥有話說,學習前端不迷路,歡迎多多留言交流...

胡哥有話說,一個有技術,有情懷的胡哥!現任京東前端攻城獅一枚。
胡哥有話說,專注於大前端技術領域,分享前端系統架構,框架實現原理,最新最高效的技術實踐!