En tant que question d'entrevue, elle est généralement posée sur les aspects techniques de l'échange sur place d'éléments 8 bits pour inverser leur ordre (quels que soient les personnages que ceux-ci pourraient réellement représenter).
Dans le même temps, surtout si vous interviewez une personne relativement âgée, vous pouvez au moins espérer entendre des questions sur les spécifications et la forme exacte de l'entrée. Même si vous les renvoyez au cas simple de l'échange d'éléments 8 bits, sachant s'ils pensent ou non en termes plus larges que cela peut être utile.
Si vous devez gérer une large gamme d'entrées, vous devez penser à peu près en termes de "pile", un peu comme une pile réseau. Vous devez créer votre logiciel en plusieurs couches, chacune appliquant un ensemble de transformations assez spécifique dans un ordre spécifique. Cela vous permet de garder chaque partie de la transformation suffisamment simple pour que vous puissiez la garder sous contrôle et avoir une chance raisonnable de la faire répondre à ses besoins.
Je vais décrire une possibilité que j'ai trouvée au moins quelque peu réalisable. Je suis le premier à admettre que d'autres peuvent avoir de meilleures idées. Au moins pour moi, cela ressemble un peu à l'ingénierie par force brute, avec peu d'élégance réelle.
Vous voulez normalement commencer par convertir toute autre représentation en UCS-4 (alias UTF-32). Pour cela, vous préférez généralement compter sur les commentaires de l'utilisateur plutôt que d'essayer de le découvrir par vous-même. Dans certains cas, vous pouvez être sûr qu'une séquence d'octets particulière ne suit pas les règles d'un schéma de codage particulier, mais vous pouvez rarement (voire jamais) être sûr qu'elle suit un schéma de codage particulier.
L'étape suivante est facultative. Vous pouvez normaliser l'entrée à l'un des quatre formulaires de normalisation Unicode. Dans ce cas, vous auriez probablement voudrez appliquer la transformation "NFKC": décomposition de compatibilité suivie d'une composition canonique. Cela convertira (si possible) la combinaison des formes diacritiques (comme le U + 301 que Jon a mentionné) en points de code uniques (par exemple, un "A" avec un "U + 301" serait converti en "A majuscule latin avec aigu"). , U + 00C1).
Vous parcourez ensuite tous les caractères du début à la fin, divisant la chaîne en caractères réels - et s'il existe (toujours) des signes diacritiques, en les conservant avec les caractères qu'ils modifient. Le résultat sera généralement un index des caractères réels de la chaîne, tels que la position et la longueur de chacun.
Vous inversez l'ordre de ces caractères complets, généralement en utilisant l'index que vous avez créé à l'étape précédente.
Vous appliquez ensuite (à nouveau, éventuellement) un autre processus de normalisation Unicode, tel que NFD (décomposition canonique). Cela transformera le "Latin A avec aigu" susmentionné en deux points de code - un "Latin A majuscule" et un "Combinaison aiguë". Si votre entrée est arrivé à contenir un U + 00C1 pour commencer, cependant, il serait également convertir que en deux points de code.
Vous encodez ensuite la séquence de points de code UCS-4 dans l'encodage souhaité (UTF-8, UTF-16, etc.)
Notez que les étapes de normalisation Unicode peuvent / changeront le nombre de points de code nécessaires pour stocker la chaîne, donc si vous les incluez, vous ne pouvez plus planifier l'ajustement de la chaîne de résultat dans le stockage d'origine. De toute évidence, les points de code résultants peuvent ne pas correspondre directement non plus aux points de code d'entrée.