Đảo ngược chuỗi là một câu hỏi khá phổ biến khi các bạn lập trình hay đi phỏng vấn (mình đoán thế, vì mình chưa gặp :P). Nếu được hỏi, mình đoán câu hỏi sẽ như thế này: Làm thế nào để đảo ngược một chuỗi mà không dùng hàm có sẵn trong JS vậy em? Hoặc áp dụng đệ quy, em đảo chuỗi cho anh xem nào :v.
Thực ra trên mạng có rất nhiều cách, và cũng có rất nhiều người viết về chủ đề này rồi. Hôm này mình chỉ tổng hợp lại cách mình thích dùng nhất.
Cơ bản nhất, sử dụng vòng lặp (loop)
Có lẽ cơ bản nhất, cách bung ra trong đầu bạn đầu tiên khi gặp yêu cầu này là sử dụng for loop. Cách tiếp cận sử dụng for loop về cơ bản là lặp từng ký tự trong chuỗi đó từ đuôi tới đầu (bạn có thể cho lặp từ đầu tới đuôi) và tạo một chuỗi mới để “chứa” kết quả.
1 | function reverseString(string) { |
Bạn có thể sử dụng cái khác thay cho for
, như while
hoặc trong ES6 thì là for … of
, forEach
chẳng hạn.
Sử dụng hàm reduce()
Đây có lẽ là cách giải quyết khá độc, khi mà cũng không nhiều người để ý đến hàm ni :D. Hàm reduce chỉ dùng với array nên chúng ta cần làm là chuyển chuỗi về array sau đó dùng reduce để đảo ngược lại.
Hàm reduce
nhận vào 2 tham số (tham số thứ hai là tham số tùy chọn, có hay không cũng được). Tham số đầu tiên nhận vào là một function
(callback) giang hồ gọi nó là reducer
.
1 | function reverseString(string) { |
Sử dụng đệ quy
Để sử dụng đệ quy chúng ta cần dùng đến hàm substring()
và charAt()
.
Hàm substring()
sẽ trả về một phần trong chuỗi đoạn ở giữa vị trí bắt đầu và vị trí kết thúc.
Syntax của substring: str.substring(indexStart[, indexEnd])
. indexEnd
không bắt buộc, vì khi không truyền vào, thì nó hiểu bạn sẽ lấy tất cả phần còn lại.
1 | 'hello'.substring(1); // 'ello' |
Hàm charAt sẽ trả về ký tự tại vị trí chỉ định trong chuỗi.
1 | 'hello'.charAt(1); // 'e' |
Ví dụ cách đảo chuỗi bằng đệ quy
1 | function reverseString(string) { |
Viết ngắn gọn bằng toán tử ba ngôi:
1 | function reverseString(string) { |
Lưu ý: có thể thay charAt(0)
bằng cách gọi trực tiếp như string[0]
.
Như các bạn đã biết, về bản chất số lần đệ quy sẽ bằng với độ dài của chuỗi, lại thêm mỗi lần đệ quy nó sẽ lưu vào stack để gọi lại. Chính vì rứa, sử dụng đệ quy với chuỗi dài sẽ rất chậm.
Sử dụng hàm có sẵn
Hàm có sẵn ở đây là reverse()
. Tuy nhiên hàm này chỉ dành cho array mà thôi, chính vì thế chúng ta cần chuyển chuỗi về array bằng cách sử dụng hàm split()
. Sau khi reverse xong thì ta lại dùng hàm join
để nối các phần tử trong mảng thành chuỗi trở lại.
Ví dụ (cách viết dài dòng)
1 | function reverseString(string) { |
Cách viết nhanh gọn:
1 | function reverseString(string) { |
Sử dụng toán tử spread trong ES6
ES6 giới thiệu một cách để convert chuỗi sang array nhanh chóng đó là toán tử spread
. Về cơ bản giống với cách sử dụng hàm có sẵn, nhưng trông có vẻ hù người tốt hơn.
1 | function reverseString(string) { |
Cuối cùng
Tuy không có chi to tát, cơ mà biết đâu khi đi phỏng vấn họ lại hỏi thì sao. :)) Mình hi vọng nó sẽ giúp ích cho các bạn.
Tham khảo từ: