Dany jest pewne wyrażenie złożone z małych liter alfabetu łacińskiego. Drugie wyrażenie jest złożone z tych samych liter co pierwsze, ale zawiera dodatkowy znak. Znajdź go i wypisz odpowiedź!
Przykładowo ciąg "abc" i "abcd" różnią się literą "d". Oczywiście dodatkowy znak może wystąpić na dowolnej pozycji, a litery w każdym wyrażeniu są ustawione w sposób losowy. Przykładowo "rqywtew" oraz rqywetew". Tym razem obydwa wyrażenia różnią się o dodatkową literę "e".
Jeden ze sposobów na rozwiązanie tego problemu wykorzystuje sortowanie. Mianowicie, aby znaleźć dodatkowy znak wpierw sortujemy obydwa wyrażenia. Wtedy zagwarantowane jest to, że na któreś pozycji znaki będą różne, albo dodatkowy znak będzie znajdować się na końcu. Wykorzystując najlepsze możliwe sortowanie złożoność takiego rozwiązania to O(nlog(n)).
Oto przykładowy kod:
Najpierw sortowane są wyrażenia, a potem w pętli wyszukiwana jest para różnych znaków. Jeśli jednak taka para się nie znajdzie to znaczy, że dodatkowy znak jest na końcu i należy go zwrócić.
Optymalnym rozwiązaniem jest wykorzystnie operacji bitowej XOR. Mianowicie XOR dla dwóch takich samych wartości zwraca 0 i dodatkowo jest operacją przemienną tj. a XOR b = b XOR a itd. Jeśli zostanie obliczony XOR wszystkich znaków to na końcu zostanie dodatkowy znak. Wynika to z faktu, że wszystkie znaki prócz niego zostaną wyzerowane. Zaletą takiego rozwiązanie jest złożoność liniowa O(n) Oto kod szukający dodatkowego znaku wykorzystując operacje XOR:
Początkowo szukany znak należy ustawić na 0, a potem obliczyć XOR wszystkich znaków. Wynik takiej sumy jest szukanym znakiem.
W celu przetestowania napisanych funkcji można posłużyć się fragmentem poniższego programu:
Napisz program, który znajdzie dodatkowy znak wykorzystując operacje arytmetyczne tj. dodawanie i odejmowanie. Wskazówka: różnica sumy znaków jednego oraz drugiego znaku wynosi dokładnie tyle co dodatkowy znak.