Chuyện phỏng vấn hay là về bài toán format số tiền
Javascript
249
format
1
interview
6
thuat toan
1
White

Trần Phong Phú viết ngày 29/07/2018

Vài dòng dẫn chuyện trước khi đọc code

Như đã từng đề cập trong một bài viết cách đây ít lâu, rằng việc phỏng vấn và đánh giá một lập trình viên là không dễ, nhất là chỉ thông qua một buổi phỏng vấn.

Một trong những phương pháp tôi hay dùng trong phỏng vấn trực tiếp ứng viên là đặt câu hỏi về thuật toán, các câu hỏi này nhằm các mục đích đánh các kỹ năng về: phương pháp suy luận, khả năng phân tích, khả năng giải quyết vấn đề của ứng viên. Các ưu nhược điểm của ứng viên có thể được bộc lộ thông qua một vài câu hỏi như vậy.

Một trong những câu hỏi yêu thích của tôi là:

Hãy viết một function formatCurrency để format giá tiên với input đầu vào là một số tiền nguyên không âm, và output kết quả trả về là một chuỗi được format theo kiểu VND. Ví dụ: formatCurrency(1000000) kết quả là: 1.000.000

Lời cảm ơn.

Cảm ơn TheDevBand - An assistant to developersSendo.vn - nền tảng thương mại trực tuyến hàng đầu Việt Nam đã tài trợ bài viết này.

Cách tiếp cận số 1

Cách này là biến số thành một chuỗi rồi duyệt qua mỗi nhóm 3 phần tử bắt đầu từ hàng đơn vị để thêm vào dấu . Cách này, tôi để ý trong quá trình phỏng vấn là được nhiều ứng viên lựa chọn nhất để làm. Có vẻ vì nó lý luận đơn giản dễ suy nghĩ và dễ viết ra thành code.

function formatCurrency(n, separate = "."){
  var s = n.toString();
  var len = s.length;
  var ret = "";
  for(var i = 1; i <= len; i++) {
    ret = s[(len-i)] + ret;
    if( i % 3  === 0 && i < len) {
      ret = separate + ret;
    }
  }
  return ret;
}

Cách tiếp cận số 2

Có một số ứng viên chọn phương pháp chia cho 1000 để lấy phần dư, các này tôi cho rằng là thú vị nhất, và sau đây là cách cài đặt của nó. Cách này trong quá trình phỏng vấn thì được ít ứng viên ưu tiên lựa chọn để cài đặt hơn. Vì tôi cũng thấy nó khá nhập nhằng nhất là ở vụ:

  • Phải xử lý khi nó chia cho một 1000 nhưng có gí trị bé hơn 100
  • Rồi sau đó xử lý dấu chia tách nữa.
function formatCurrency(n, separate = "."){
  var ret = "";
  do {
    let t = n % 1000;
    n = n / 1000 | 0;
    if( n > 0) {
      ret = ("00" + t).substr(-3) + ret;
      ret = separate + ret;
    } else {
      ret = t + ret;
    }
  } while(n > 0);
  return ret;
}

Cách tiếp cận số 3

Cách giải số 3 nhìn ngắn gọn và có tính thách đố cao nhất, và để hiểu được cách viết như vậy bạn có thể phải tìm hiểu lại về Regular Expression.

Cách này tôi cũng không thấy có ứng viên nào lựa chọn, đơn giản là vì không có mấy người nhớ được cái expression đó, tôi ví dụ ra đây cũng để tham khảo cho vui thôi.

Tham khảo:

function formatCurrency(n, separate = "."){
  var s = n.toString();
  var regex = /\B(?=(\d{3})+(?!\d))/g;
  var ret = s.replace(regex, separate);
  return ret;
}

Lời kết

Nhân một chiều thú vị, viết một vài để cùng đàm đạo với các bạn gần xa.
Chúc các bạn có một tối chủ nhật vui vẻ, và sang tuần mới có nhiều năng lượng để tiếp tục coding.
Nhưng điều nữa là cảm ơn các bạn đã đọc đến đây.
Nếu thấy bài viết thú vị, hãy comment một điều gì đó, nhưng xin đừng nói lời cay đắng. :)

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Trần Phong Phú

3 bài viết.
17 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
21 1
Có thể nói vào những năm gần đây, phỏng vấn không còn đơn thuần là hoạt động một chiều, với việc các công ty có toàn quyền đánh giá ứng viên theo c...
Trần Phong Phú viết 2 tháng trước
21 1
White
11 2
(Ảnh) "Mobile first" hay "Think mobile" là một trong những hot trend mà chúng ta thường được nghe gần đây, khi mà số lượng thiết bị di động và số ...
Trần Phong Phú viết 2 tháng trước
11 2
Bài viết liên quan
White
45 8
Tăng sức mạnh cho javascript với lodash Lần này mình sẽ giới thiệu 1 thư viện javascript vô cùng bá đạo có tên là "lodash]1]", có thể nói nó là LI...
Huy Hoàng Phạm viết hơn 2 năm trước
45 8
White
27 8
Lâu không post gì muốn viết một bài dài dài về js cơ mà đau đầu quá viết mãi không xong, thôi post bài ngắn vậy :smiley: Lấy screen size ở đây tôi...
Hoàng Duy viết gần 3 năm trước
27 8
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
3 bài viết.
17 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!