Насчет асма не знаю, а ото все с плюсами и делениями конечно красиво, но в реальной жизни что будет если оба значения близки к максимально возможному для типа int? Уж не говоря о том что вариант с делением херово будет работать с нечетными числами
.NET - Interlocked.Exchange
Win32/64 - InterlockedExchange, InterlockedExchangePointer, InterlockedExchange64
хотя ... вот интересно ... более чем уверен, что в универе/институте/академии/школе ожидался ответ со сложением/вычитанием (это старая (боянная) теоретическая задача) ... а вот на практике как бы оценивали предложенные ответы?
Я бы на собеседовании таких задач не задавал. Во-первых даже если не идиот - ответить быстро сложно психологически, если не знаешь ответа заранее. Во-вторых достаточно задач из реальной программисткой жизни над которыми и так все стреляются
кстати, выложи типовые вопросы с собеседований под .нет?
Ага, щазУвидимся на собеседовании, если чё
да я же не прошу именно ваши.
просто, к примеру
но подобные вопросы врядли особо помогут, особенно если попадёшь на собеседование к разным знатокам типа предыдущего оратора
По опыту могу сказать, прикладному программисту (которых основная масса) глубокое знание алгоритмов может пригодится, а может и НЕТ (куча библиотек уже написана и переписана, главное знать где-что лежит).
Задачка простая, но мне понравилась
Есть массив A[N] из N-чисел.
Необходимо получить массив Output, i-й элемент которого равны произведению всех элеметов массива A[N] кроме A.
Т.е. Output[0] = A[1]*…*A[N]
Output[1] = A[0]*A[2]*…*A[N]
и т.д.
Как решить эту задачу за линейное время, не используя оператора деления?
Мало того, что поднята из безвестности тема, которая завтра 2 года со дня последнего сообщения, так ещё и не выполнено ключевое условие задачи, а именно:Вариант первый:
...Код:int A[6] = {1,2,3,4,5,6}; int out[6]; for(int sum=1,i=0;i<6;i++) { for(int j=0;j<6;j++) { ...
Я надеюсь, Вы хотя бы понимаете, что значит "за линейное время".Как решить эту задачу за линейное время, не используя оператора деления?
вот такая конструкция должна и в сях работать (в пхп точно работает)
$a ^= $b ^= $a ^= $b;
в чем нелинейность времени варианта с STL ?
sum = accumulate(A.begin(),i,1,multiplies<int>());
sum *= accumulate(i+1,A.end(),1,multiplies<int>());
Как решить эту задачу за линейное время, не используя оператора деления?
private static double[] GetOutput( double[] a )
{
var n = a.Length;
var result = new double[n];
var left = new double[n];
var right = new double[n];
left[0] = 1;
right[n-1] = 1;
for( var i = 1; i < n; i++ )
{
left[i] = left[i - 1]*a[i - 1];
right[n-i - 1] = right[n- i]*a[n - i];
}
for( var i = 0; i < n; i++)
{
result[i] = left[i]*right[i];
}
return result;
}
Что, Мураз, не смог устроиться на 1.6 минималки? Ну хз, Страуструпа почитай или кого там еще рекомендуют. Собеседование - это вообще зло, спрашивают одно, в работе будет нужно совсем другое, и к чему оно все было - нипанятна...
Вот тестовое задание ,которое обеспечивает незамедлительный прием на работу с окладом в аж 1.673 минимальные заработные платы.
Необходимо связать символическое имя с участком памяти,которое он займет. Тоесть ,используя некоторый процесс вычисления ,применимо к символической состовляющей ,выйти на начало отрезка памяти,которое ему отведено.
Задача так сформулирована чтобы взорвать мозг?