โจทย์
แพตเทิร์น builder ใช้สร้างวัตถุที่ซับซ้อนทีละขั้น และให้ผลลัพธ์สุดท้ายเมื่อจบขั้นตอน ดังนั้นผู้เรียกจึงสามารถกำหนดส่วนต่าง ๆ ได้ในลำดับใดก็ได้
แต่ละส่วนเป็นคีย์เวิร์ด เว้นวรรคหนึ่งตัว และข้อความของมัน:
select <columns>: รายชื่อคอลัมน์คั่นด้วยจุลภาค (ช่องว่างรอบจุลภาคอาจแตกต่างกันได้) เป็นตัวเลือก; ค่าเริ่มต้นคือ*.from <table>: จำเป็นต้องมี.where <condition>,order <columns>,limit <n>: เป็นตัวเลือก.
ถ้ามีคีย์เวิร์ดใดปรากฏมากกว่าหนึ่งครั้ง ค่าอันล่าสุดจะถูกใช้ สร้าง query ตามลำดับคงที่นี้ โดยใช้ช่องว่างเดี่ยว:
SELECT <columns> FROM <table>[ WHERE <condition>][ ORDER BY <columns>][ LIMIT <n>]
ในรายการ SELECT ให้ตัดช่องว่างของแต่ละคอลัมน์ และนำมารวมกันด้วย , . ข้อความอื่นทั้งหมดให้คัดลอกโดยไม่เปลี่ยนแปลง
Implement query_builder(parts).
ข้อมูลนำเข้า
parts: The parts, in any order.
ผลลัพธ์
Return the SQL query string.
เงื่อนไข
1 ≤ จำนวนส่วน ≤ 20
มีส่วน from อย่างน้อยหนึ่งส่วน แต่ละส่วนยาวไม่เกิน 100 อักขระ
ตัวอย่าง
อินพุต:
parts = ["where age \u003e 18", "from users", "select name,age"]
ผลลัพธ์ที่คาดหวัง:
expected = "SELECT name, age FROM users WHERE age \u003e 18"
อินพุต:
std::vector<std::string> parts = {"where age \u003e 18", "from users", "select name,age"};
ผลลัพธ์ที่คาดหวัง:
std::string expected = "SELECT name, age FROM users WHERE age \u003e 18";
อินพุต:
string[] parts = new string[] {"where age \u003e 18", "from users", "select name,age"};
ผลลัพธ์ที่คาดหวัง:
string expected = "SELECT name, age FROM users WHERE age \u003e 18";
คำอธิบาย
ส่วนต่าง ๆ มาไม่เรียงลำดับ แต่คำสั่งจะสร้างเป็น SELECT … FROM … WHERE … เสมอ: "SELECT name, age FROM users WHERE age > 18"
อินพุต:
parts = ["from orders", "limit 10", "order total DESC"]
ผลลัพธ์ที่คาดหวัง:
expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10"
อินพุต:
std::vector<std::string> parts = {"from orders", "limit 10", "order total DESC"};
ผลลัพธ์ที่คาดหวัง:
std::string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
อินพุต:
string[] parts = new string[] {"from orders", "limit 10", "order total DESC"};
ผลลัพธ์ที่คาดหวัง:
string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
คำอธิบาย
เมื่อไม่มีส่วน select คอลัมน์จะเป็น * โดยปริยาย: "SELECT * FROM orders ORDER BY total DESC LIMIT 10"
แนวทางการแก้
ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ
คำใบ้ 1
เก็บแต่ละส่วนตามคีย์เวิร์ดก่อน แล้วค่อยสร้างข้อความตอนท้าย
คำใบ้ 2
ส่วนที่มาทีหลังซึ่งมีคีย์เวิร์ดเดียวกันจะแทนที่ส่วนก่อน
คำใบ้ 3
ตัดช่องว่างของแต่ละคอลัมน์ใน SELECT และใช้ * เมื่อไม่มีส่วน select
ความซับซ้อนที่คาดหวัง
เวลา O(ความยาวรวม), หน่วยความจำเพิ่ม O(ความยาวรวม)
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน