Перестановка символьных значений местами без использования промежуточной переменной в PHP
Вводная
Часто на собеседованиях задают вопросы касающиеся алгоритмов, одна из излюбленных задач — перестановка числовых переменных без использования временной промежуточной переменной.
Есть несколько вариантов такой перестановки: «Перестановка через XOR», «Перестановка через арифметические вычитание и сложение», не буду приводить их здесь полностью, любопытные могут воспользоваться ссылкой в конце текста.
Собственно созерцание этих алгоритмов навело меня на мысль о возможности перестановки строковых (символьных) значений.
Суть
Отмечу сразу, что данный код актуален для PHP, и, например, неактуален для Perl (где, насколько мне известно, подобная перестановка решается присваиванием по списку). Наверняка есть языки, где данная мозговая перверсия тоже невозможна.
Наверняка здесь я «изобрёл велосипед», и кто-то уже давно это проходил, но всё же…
<?php
$a = 'a'; // переменная А равна 'a'
$b = 'b'; // переменная Б равна 'б'
echo 'A='.$a.', B='.$b."\n"; // Outputs: A=a, B=a
$a = $a.$b; // переменная А равна 'aб'
$b = str_replace($b,'',$a); //удаляем из переменной А (из 'аб') содержимое переменной Б (букву 'б'), результат присваиваем переменной Б. Теперь Б = 'а'.
$a = str_replace($b,'',$a); //удаляем из переменной А (из 'аб') содержимое переменной Б (букву 'а'), результат присваиваем переменной А. Теперь А = 'б'.
echo 'A='.$a.', B='.$b."\n"; // Outputs: A=b, B=a т.е. переменная А равна 'б', переменная Б равна 'а'
?>
Резюме
Могу добавить, что данный алгоритм может представлять только чисто академический интерес, т.к. замеры времени показали — обычная замена символьных значений с использованием промежуточной переменной выполняется быстрее на порядок.
Аналогичные замеры «перестановки числовых значений через вычитание и сложение» так же показали проигрыш (правда не такой существенный) по производительности по сравнению с перестановкой с использованием временной переменной.
Теперь на собеседовании, на вопрос: «А вы сможете поменять две числовые переменные местами используя только эти две переменные?» Вы сможете смело ответить: «Да, и не только числовые!».
ссылка для любопытных:
Swapping Values — Stanford.edu
0 комментариев