Hoán đổi giá trị của ba số nguyên dương a - b và c mà không dùng thêm biến tạm

Bài viết được sự cho phép của BBT Tạp chí Lập trình

Trong lập trình, thông thường để hoán đổi hai giá trị phải sử dụng 1 biến phụ và mất tới 3 dòng lệnh. Bạn có ngạc nhiên không nếu có một cách đơn giản hơn nhiều để hoán đổi hai giá trị mà không cần biến phụ mà chúng ta có thể sử dụng được trong JavaScript?

Sẽ có hai loại hoán đổi ở đây. Loại thứ nhất là hoán đổi biến kiểu nguyên thủy, ta sẽ hoán đổi hai số trước. Loại còn lại phức tạp hơn, ta sẽ hoán đổi hai biến kiểu bất kỳ: Object, String, Float,…

Mục tiêu ở đây ta sẽ hoán đổi hai biến a và b [kiểu bất kỳ]

Như thường lệ, ta sử dụng một biến c, tạm thời lưu trữ giá trị ban đầu của a rồi sau đó tiến hành hoán đổi. Nhưng liệu có cách nào mà không phải sử dụng biến tạm thời không? Có, có chứ!

Hãy bắt đầu với loại đầu tiên: hoán đổi hai số nguyên.

Hoặc

Sử dụng toán tử XOR

Với biến kiểu số nguyên, ta có thể khéo léo sử dụng toán tử đảo bit là XOR:

Hoặc

Đây gọi là thuật toán hoán đổi sử dụng XOR. Nguyên lý của nó được miêu tả cụ thể ở đây [Wikipedia].

Một vài mẹo hay ho khác:

Cách này ta sử dụng comma operator [toán tử dấu phẩy] không cần biến phụ, không cần mảng, có thêm thắt một chút, và nó chạy rất nhanh. Trong thực tế đôi khi nó còn nhanh hơn cách dùng biến phụ nếu chạy trên một vài nền tảng. Và nó đúng với mọi loại số, không bao giờ tràn bộ nhớ, và cân luôn mấy trường hợp đặc biệt chẳng hạn Infinity hay NaN.

Các bước chạy cụ thể như sau:

  1. [b=a, 0]: gán giá trị ban đầu của a cho b, trả về số 0.
  2. a = b + 0: gán giá trị b [ban đầu] + 0 cho a, tức gán a = b.

Cách hoán đổi khác, cũng một dòng: 

Vẫn là hoán đổi một dòng, nhưng dùng XOR:

  10 câu hỏi javascript để nâng cao trình độ

  10 câu hỏi JavaScript để tăng cường kỹ năng của bạn

Loại thứ hai khó hơn một chút, ta sẽ hoán đổi giá trị hai biến bất kỳ.

Mẹo này sử dụng một mảng để thực hiện hoán đổi.

Có vài thứ xảy ra trên cùng một dòng lệnh:

  1. Đầu tiên, ta khởi tạo một mảng với phần tử đầu là b, phần tử thứ hai là b.
  2. Gán giá trị phần tử thứ hai, b = a ngay khi vừa khởi tạo mảng.
  3. Gán giá trị của phần tử đầu trong mảng, tức giá trị của b cho a.

Ở ES6 ta sử dụng self executing arrow function:

Nếu là ES5 câu lệnh trên được viết là:

Kể từ ES6, ta có thể hoán đổi hai giá trị một cách đơn giản hơn rất nhiều, sử dụng hai mảng, gọi là destructuring assignment, như sau:

Author: Lê Bảo Hưng – Bài viết gốc tại Tạp Chí Lập Trình

Có thể bạn quan tâm:

Xem thêm các việc làm JavaScript hấp dẫn tại TopDev

Video liên quan

Chủ Đề