Мне нужно поменять местами две переменные с числовым значением, не используя третью переменную. Какое простое решение?
Как поменять местами без третьей переменной?
- возможный дубликат Поменять местами значения двух переменных без использования третьего переменная. Также обмен местами двух переменных без использования временной переменной 17.03.2011
- stackoverflow.com/ вопросы/804706/ 17.03.2011
- @ Буду ли я видеть, как некоторые используют подобные вещи в качестве каверзных вопросов во время интервью. Я не знаю, что это должно было доказать, но я это видел.. 03.06.2017
Ответы:
Давайте рассмотрим один из методов, а именно использование арифметических операторов. Рассмотрим 2 переменные, скажем, x = 50 и y = 70, и давайте посмотрим, как поменять местами значения двух переменных, то есть сделать x = 70 и y = 50, не используя третью переменную. Это можно сделать с помощью следующих арифметических операций, а именно:
x= x + y
y= x - y
x= x - y
Что дает
• x= x + y дает x= 70 + 50, поэтому x равно 120
• y= x - y дает y = 120 - 70, что делает значение y равным 50
• x= x - y дает x = 120 - 50 и, таким образом, значение x становится 70
Вы можете добиться этого с помощью XOR
int A = ...;
int B = ...;
A = A ^ B;
B = A ^ B;
A = A ^ B;
В зависимости от типа переменной вы можете использовать Interlocked.Exchange а>. Это использует атомарную операцию для выполнения свопа.
Еще один популярный способ — стратегия замены XOR. http://en.wikipedia.org/wiki/XOR_swap_algorithm
Здесь у нас есть это на ассемблере MIPS. Первое решение длинное и плохое. Второй с XOR лучше.
addi $t0, $0, -5
addi $t1, $0, 15
add $t0, $t0, $t1
sub $t1, $t1, $t0
nor $t1, $0, $t1
addi $t1, $t1, 1
sub $t0, $t0, $t1
####
xor $t0, $t0, $t1
xor $t1, $t0, $t1
xor $t0, $t0, $t1
x -= y = (x += y) - y;
и скажите учителю, что это один из самых глупых вопросов. 17.03.2011