Đề bài
Mẫu builder xây dựng một đối tượng phức tạp từng bước và tạo ra kết quả cuối cùng ở cuối cùng, vì vậy người gọi có thể đặt các phần theo bất kỳ thứ tự nào.
Mỗi phần là một từ khóa, một khoảng trắng, và nội dung của nó:
select <columns>: tên cột được phân tách bằng dấu phẩy (khoảng trắng quanh dấu phẩy có thể thay đổi). Không bắt buộc; giá trị mặc định là*.from <table>: bắt buộc.where <condition>,order <columns>,limit <n>: không bắt buộc.
Nếu một từ khóa xuất hiện hơn một lần, giá trị cuối cùng sẽ được dùng. Hãy xây dựng truy vấn theo thứ tự cố định này, với một khoảng trắng đơn:
SELECT <columns> FROM <table>[ WHERE <condition>][ ORDER BY <columns>][ LIMIT <n>]
Trong danh sách SELECT, hãy trim từng cột và nối chúng bằng , . Mọi văn bản khác được sao chép nguyên vẹn.
Cài đặt query_builder(parts).
Input
parts: Các phần, theo bất kỳ thứ tự nào.
Output
Trả về chuỗi truy vấn SQL.
Ràng buộc
1 ≤ số phần ≤ 20
Có ít nhất một phần from; mỗi phần có tối đa 100 ký tự
Ví dụ
Đầu vào:
parts = ["where age \u003e 18", "from users", "select name,age"]
Kết quả mong đợi:
expected = "SELECT name, age FROM users WHERE age \u003e 18"
Đầu vào:
std::vector<std::string> parts = {"where age \u003e 18", "from users", "select name,age"};
Kết quả mong đợi:
std::string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Đầu vào:
string[] parts = new string[] {"where age \u003e 18", "from users", "select name,age"};
Kết quả mong đợi:
string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Giải thích
Các phần đến không theo thứ tự, nhưng truy vấn luôn được xây dựng theo dạng SELECT … FROM … WHERE …: "SELECT name, age FROM users WHERE age > 18".
Đầu vào:
parts = ["from orders", "limit 10", "order total DESC"]
Kết quả mong đợi:
expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10"
Đầu vào:
std::vector<std::string> parts = {"from orders", "limit 10", "order total DESC"};
Kết quả mong đợi:
std::string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Đầu vào:
string[] parts = new string[] {"from orders", "limit 10", "order total DESC"};
Kết quả mong đợi:
string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Giải thích
Nếu không có phần select thì các cột mặc định là *: "SELECT * FROM orders ORDER BY total DESC LIMIT 10".
Hướng tiếp cận
Hãy tự thử trước, sau đó mở từng gợi ý một.
Gợi ý 1
Lưu từng phần theo từ khóa trước; chỉ tạo câu lệnh ở cuối.
Gợi ý 2
Phần đến sau có cùng từ khóa sẽ thay phần trước.
Gợi ý 3
Cắt khoảng trắng từng cột trong danh sách SELECT và dùng * khi không có phần select.
Độ phức tạp mong đợi
thời gian O(tổng độ dài), bộ nhớ phụ O(tổng độ dài)
Tham khảo
Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.