0
0
Lập trình
Admin Team
Admin Teamtechmely

LeetCode Challenge Ngày 9 — 166. Phân số thành Thập phân Lặp lại

Đăng vào 3 tuần trước

• 4 phút đọc

Giới thiệu

Chào mọi người 👋

Ngày thứ 9 trong chuỗi thử thách LeetCode của tôi! Hôm nay không phải là ngày dễ dàng nhất — tôi đã làm việc tại một quán cà phê thay vì bàn làm việc của mình ☕, vì vậy không có video hướng dẫn lần này. Nhưng chuỗi thử thách vẫn phải tiếp tục 💪.

Tóm tắt Vấn đề

Chúng ta đang chia hai số nguyên và trả về kết quả dưới dạng chuỗi.

  • Nếu phần thập phân kết thúc → chỉ cần trả về kết quả.
  • Nếu phần thập phân lặp lại → bọc các chữ số lặp lại trong dấu ngoặc đơn 🔄.

Ví dụ:

  • 1/2 → "0.5"
  • 2/1 → "2"
  • 4/333 → "0.(012)"

Thấu hiểu Chìa Khóa

Khi thực hiện phép chia dài, một phần dư lặp lại có nghĩa là các chữ số sẽ bắt đầu lặp lại.
Vì vậy, hãy theo dõi các phần dư trong một bản đồ và chèn dấu ngoặc khi một chu kỳ được phát hiện.

Hướng Dẫn Chi Tiết

Bước 1: Khởi tạo

Chúng ta sẽ cần một vài biến:

  • numerator: Tử số của phép chia.
  • denominator: Mẫu số của phép chia.
  • result: Chuỗi kết quả.
  • remainderMap: Bản đồ để theo dõi các phần dư.

Bước 2: Phép chia và theo dõi phần dư

Sử dụng phép chia dài để tìm phần thập phân. Trong quá trình này, nếu chúng ta phát hiện một phần dư đã tồn tại, điều đó có nghĩa là chúng ta đã bắt đầu một chu kỳ.

javascript Copy
function fractionToDecimal(numerator, denominator) {
    if (numerator === 0) return "0";
    let result = '';
    if (numerator < 0 !== denominator < 0) result += '-';
    numerator = Math.abs(numerator);
    denominator = Math.abs(denominator);

    let integerPart = Math.floor(numerator / denominator);
    result += integerPart;
    let remainder = numerator % denominator;
    if (remainder === 0) return result;
    result += '.';

    let remainderMap = new Map();

    while (remainder !== 0) {
        if (remainderMap.has(remainder)) {
            let index = remainderMap.get(remainder);
            let nonRepeatingPart = result.substring(0, index);
            let repeatingPart = result.substring(index);
            result = nonRepeatingPart + '(' + repeatingPart + ')';
            return result;
        }
        remainderMap.set(remainder, result.length);
        remainder *= 10;
        integerPart = Math.floor(remainder / denominator);
        result += integerPart;
        remainder %= denominator;
    }
    return result;
}

Ghi Chú về Mã

  • Hãy chắc chắn rằng bạn đã kiểm tra các trường hợp biên như chia cho 0 hoặc các số âm.
  • Đoạn mã trên có thể mở rộng cho nhiều trường hợp biên khác nhau.

Các Thực Hành Tốt Nhất

  • Luôn kiểm tra các trường hợp đặc biệt như số 0 hoặc nếu tử số và mẫu số đều âm.
  • Sử dụng bản đồ để theo dõi phần dư là một kỹ thuật hiệu quả để xác định chu kỳ.

Các Cạm Bẫy Thường Gặp

  • Không xử lý trường hợp chia cho 0.
  • Không theo dõi chính xác các phần dư có thể dẫn đến lỗi lặp vô hạn.

Mẹo Tăng Hiệu Suất

  • Trong những tình huống có số lớn, hãy chú ý tới hiệu suất của phép chia và các phép toán.
  • Sử dụng các cấu trúc dữ liệu phù hợp để tối ưu hóa việc theo dõi phần dư.

Khắc Phục Lỗi

  • Nếu bạn gặp lỗi về chu kỳ không kết thúc, hãy kiểm tra xem bạn có đang theo dõi các phần dư đúng cách không.
  • Đảm bảo rằng bạn không quên cập nhật giá trị của phần dư sau mỗi lần lặp.

Kết Luận

Ngày thứ 9 đã hoàn thành ✅ — tôi rất háo hức cho ngày thứ 10 vào ngày mai 🚀. Nếu bạn có bất kỳ câu hỏi nào về bài toán này hoặc cần thêm hỗ trợ, hãy để lại bình luận bên dưới nhé!

Câu Hỏi Thường Gặp (FAQ)

1. Làm thế nào để xử lý trường hợp chia cho 0?
Chia cho 0 là không hợp lệ và cần được xử lý riêng trong mã của bạn. Hãy đảm bảo trả về thông báo lỗi hoặc giá trị mặc định.

2. Có thể mở rộng mã này cho các số thực không?
Có, bạn có thể điều chỉnh mã để hỗ trợ các số thực bằng cách thay đổi cách tính toán phần nguyên và phần thập phân.

3. Tại sao cần sử dụng bản đồ để theo dõi phần dư?
Bản đồ cho phép bạn theo dõi vị trí của các phần dư để phát hiện chu kỳ một cách hiệu quả trong quá trình tính toán.

Hy vọng bài viết này sẽ giúp bạn trong việc giải quyết bài toán trên LeetCode. Chúc bạn thành công!

Tài Nguyên và Đọc Thêm


Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào