Come domanda di intervista, di solito viene chiesto solo i bit tecnici di fare uno scambio sul posto di elementi a 8 bit per invertire il loro ordine (indipendentemente da quali personaggi potrebbero effettivamente rappresentare).
Allo stesso tempo, specialmente se stai intervistando una persona relativamente senior, potresti almeno sperare di ascoltare alcune domande sulla specifica e sulla forma esatta dell'input. Anche se li rimandi al semplice caso di scambiare solo elementi a 8 bit, sapere se pensano in termini più ampi di quello può essere prezioso.
Se hai a che fare con una vasta gamma di input, devi solo pensare in termini di "stack", un po 'come uno stack di rete. Devi costruire il tuo software in un numero di livelli, ognuno dei quali applica una serie abbastanza specifica di trasformazioni in un ordine specifico. Questo ti consente di mantenere ogni parte della trasformazione abbastanza semplice da poterla tenere sotto controllo e avere una ragionevole possibilità di soddisfarla ai suoi requisiti.
Descriverò una possibilità che ho trovato almeno in qualche modo praticabile. Sono il primo ad ammettere che potrebbero esserci altri che hanno idee migliori. Almeno per me, questo sembra un po 'come l'ingegneria della forza bruta, con poca vera eleganza.
Normalmente si desidera iniziare convertendo qualsiasi altra rappresentazione in UCS-4 (aka UTF-32). Per questo, in genere preferisci fare affidamento sull'input dell'utente piuttosto che tentare di capirlo da solo. In alcuni casi, puoi essere certo che una particolare sequenza di ottetti non segue le regole di un particolare schema di codifica, ma raramente (se mai) puoi essere sicuro che segua un particolare schema di codifica.
Il passaggio successivo è facoltativo. È possibile normalizzare l'input in uno dei quattro moduli di normalizzazione Unicode. In questo caso, probabilmente vorrai applicare la trasformazione "NFKC": decomposizione di compatibilità seguita da composizione canonica. Questo (dove possibile) si convertirà combinando forme diacritiche (come l'U + 301 menzionata da Jon) in punti di codice singolo (ad esempio, una "A" con un "U + 301" verrebbe convertita in "capitale latina A con acuto" , U + 00C1).
Quindi attraversi tutti i personaggi dall'inizio alla fine, spezzando la stringa in caratteri reali - e se ci sono (ancora) combinando segni diacritici, mantenendoli con i caratteri che modificano. Il risultato di questo sarà in genere un indice dei caratteri effettivi nella stringa, come la posizione e la lunghezza di ciascuno.
Invertire l'ordine di quei caratteri completi, in genere utilizzando l'indice creato nel passaggio precedente.
Quindi (di nuovo, facoltativamente) si applica un altro processo di normalizzazione Unicode, come NFD (decomposizione canonica). Ciò trasformerà il suddetto "latino A con acuto" in due punti di codice: un "capitale latino A" e un "abbinamento acuto". Se l'input contenesse un U + 00C1 per iniziare, tuttavia, convertirà anche quello in due punti di codice.
Quindi si codifica la sequenza di punti di codice UCS-4 nella codifica desiderata (UTF-8, UTF-16, ecc.)
Si noti che i passaggi di normalizzazione Unicode possono / modificheranno il numero di punti di codice necessari per memorizzare la stringa, quindi se si includono quelli, non è più possibile pianificare l'adattamento della stringa del risultato nella memoria originale. Ovviamente, anche i punti di codice risultanti potrebbero non corrispondere direttamente ai punti di codice di input.