обмен на месте - PullRequest
       26

обмен на месте

3 голосов
/ 21 апреля 2010

как поменять два числа на место, не используя дополнительное место?

Ответы [ 4 ]

5 голосов
/ 21 апреля 2010

Вы можете сделать это, используя оператор XOR как:

if( x != y) { // this check is very important.

  x ^= y;
  y ^= x;
  x ^= y;
}

EDIT:

Без дополнительной проверки вышеуказанная логика не может поменять номер с самим собой . Пример:

int x = 10;

если я применяю вышеуказанную логику, чтобы поменять x на себя, без чека я получу x=0, что неверно.

Точно так же, если я помещаю логику без проверки в функцию и вызываю функцию, чтобы поменять две ссылки на одну и ту же переменную, произойдет ошибка.

3 голосов
/ 21 апреля 2010

Если у вас есть 2 переменные a и b : (каждая переменная занимает свой адрес памяти)

a = a xor b
b = a xor b
a = a xor b


Существуют и другие варианты этой проблемы, но они не пройдут, если произойдет переполнение:

а = а + Ь
B = A-B
а = а-б

а = а * Ь
Ь = а / Ь
а = а / б

Варианты «плюс» и «минус» могут работать, если у вас есть пользовательские типы, у которых есть операторы + и -, которые имеют смысл.


Примечание. Во избежание путаницы, если у вас есть только 1 переменная и 2 ссылки или указатели на нее, все вышеперечисленное завершится ошибкой. Проверка должна быть сделана, чтобы избежать этого.

В отличие от многих людей, не имеет значения, если у вас есть 2 разных числа. Имеет значение только то, что у вас есть две разные переменные, число которых существует в двух разных адресах памяти.

т.е. это совершенно верно:

int a = 3;
int b = 3;

a = a ^ b;
b = a ^ b;
a = a ^ b;

assert(a == b);
assert(a == 3);
3 голосов
/ 21 апреля 2010

Стандартный трюк для xor:

int x, y;
x ^= y;
y ^= x;
x ^= y;

xoring значительно менее понятен, чем просто использование temp, и он потерпит неудачу, если x и y находятся в одном и том же месте

0 голосов
/ 21 апреля 2010

Поскольку язык не был упомянут в Python:

y, x = x, y

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...