Đề bài
The builder pattern constructs a complex object step by step and produces the final result at the end, so callers can set the parts in any order.
Each part is a keyword, a space, and its text:
select <columns>: comma-separated column names (spaces around commas may vary). Optional; the default is*.from <table>: required.where <condition>,order <columns>,limit <n>: optional.
If a keyword appears more than once, the last one wins. Build the query in this fixed order, with single spaces:
SELECT <columns> FROM <table>[ WHERE <condition>][ ORDER BY <columns>][ LIMIT <n>]
In the SELECT list, trim each column and join them with , . All other texts are copied unchanged.
Implement query_builder(parts).
Input
parts: The parts, in any order.
Output
Return the SQL query string.
Ràng buộc
1 ≤ number of parts ≤ 20
At least one from part; each part has at most 100 characters
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
The parts arrive out of order, but the query is always built as 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
Without a select part the columns default to *: "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
Store each part by its keyword first; build the text only at the end.
Gợi ý 2
A later part with the same keyword replaces the earlier one.
Gợi ý 3
Trim each column in the SELECT list and use * when there is no select part.
Độ phức tạp mong đợi
O(total length) time, O(total length) extra space
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.