Problème
Le patron builder construit un objet complexe étape par étape et produit le résultat final à la fin, afin que les appelants puissent définir les parties dans n’importe quel ordre.
Chaque partie est un mot-clé, un espace, puis son texte :
select <columns>: noms de colonnes séparés par des virgules (les espaces autour des virgules peuvent varier). Facultatif ; la valeur par défaut est*.from <table>: obligatoire.where <condition>,order <columns>,limit <n>: facultatifs.
Si un mot-clé apparaît plus d’une fois, seul le dernier compte. Construisez la requête dans cet ordre fixe, avec des espaces simples :
SELECT <columns> FROM <table>[ WHERE <condition>][ ORDER BY <columns>][ LIMIT <n>]
Dans la liste SELECT, supprimez les espaces de chaque colonne et joignez-les avec , . Tous les autres textes sont copiés sans modification.
Implémentez query_builder(parts).
Entrée
parts: Les parties, dans n’importe quel ordre.
Sortie
Retournez la chaîne de requête SQL.
Contraintes
1 ≤ nombre de parties ≤ 20
Au moins une partie from ; chaque partie a au plus 100 caractères
Exemples
Entrée :
parts = ["where age \u003e 18", "from users", "select name,age"]
Sortie attendue :
expected = "SELECT name, age FROM users WHERE age \u003e 18"
Entrée :
std::vector<std::string> parts = {"where age \u003e 18", "from users", "select name,age"};
Sortie attendue :
std::string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Entrée :
string[] parts = new string[] {"where age \u003e 18", "from users", "select name,age"};
Sortie attendue :
string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Explication
Les parties arrivent dans le désordre, mais la requête est toujours construite comme SELECT … FROM … WHERE … : "SELECT name, age FROM users WHERE age > 18".
Entrée :
parts = ["from orders", "limit 10", "order total DESC"]
Sortie attendue :
expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10"
Entrée :
std::vector<std::string> parts = {"from orders", "limit 10", "order total DESC"};
Sortie attendue :
std::string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Entrée :
string[] parts = new string[] {"from orders", "limit 10", "order total DESC"};
Sortie attendue :
string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Explication
Sans partie select, les colonnes prennent la valeur par défaut * : "SELECT * FROM orders ORDER BY total DESC LIMIT 10".
Comment l'aborder
Essayez d'abord seul, puis ouvrez les indices un par un.
Indice 1
Stockez d'abord chaque partie selon son mot-clé ; construisez le texte seulement à la fin.
Indice 2
Une partie plus tardive avec le même mot-clé remplace la précédente.
Indice 3
Retirez les espaces de chaque colonne de la liste SELECT et utilisez * sans partie select.
Complexité attendue
temps O(longueur totale), espace supplémentaire O(longueur totale)
Références
Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.