Программисты знают древнюю задачу, которую полагается знать всем, идущим на интервью - это оберег такой, реально ее спрашивали в последний раз еще во время Ивана Калиты. Как пройти по связному списку до конца, но в случае, если в нем есть цикл, распознать это и не кружить бесконечно? Стандартное решение: хранить адреса или другие идентификаторы
(
Read more... )
Вот код:
auto fn_calls = 0;
auto fn = [&fn_calls, m, n](auto pos) { ++fn_calls; return (pos % m) * n + (pos / m); };
auto is_start = [fn](auto pos) -> bool {
auto this_pos = pos;
for (auto ret = 0; true; ++ret)
{
this_pos = fn(this_pos);
if (this_pos < pos)
return false;
if (this_pos == pos)
return true;
}
};
auto rotate = [&M, fn](auto i) mutable
{
auto elem = std::move(M[i]);
auto nPos = i;
do
{
nPos = fn(nPos);
std::swap(elem, M[nPos]);
} while (nPos != i);
};
for (auto i = 0; i < m * n; ++i)
{
if(is_start(i))
{
rotate(i);
}
}
Reply
Reply
Reply
Leave a comment