8
votes

Comment échanger sans une troisième variable?

Je dois échanger deux variables avec une valeur de numéro sans utiliser une troisième variable. Quelle est la solution simple?


3 commentaires

duplicaillier possible de échanger les valeurs de deux variables sans utiliser troisième variable . Aussi échanger deux variables sans utiliser de variable Temp


Stackoverflow.com/ Questions / 804706 / ...


@Will j'ai vu des questions comme des questions astuces lors des interviews. Je ne sais pas ce que c'est censé prouver , mais je l'ai vu ..


6 Réponses :


19
votes

Voyons l'une des méthodes, notamment en utilisant des opérateurs arithmétiques. Considérons 2 variables disent x = 50 et y = 70 et voyons comment échanger la valeur de deux variables qui font x = 70 et y = 50 sans utiliser la troisième variable. Cela peut être fait en utilisant des opérations arithmétiques suivantes, nommément
x = x + y
y = x - y
x = x - y
Qui donne
• x = x + y donne x = 70 + 50 an donc x est égal à 120
• y = x - y donne y = 120 - 70 qui fait la valeur de y comme 50
• x = x - y donne x = 120 - 50 et donc la valeur de x devient 70


4 commentaires

Et si X ou Y étaient très grands proportionnels à l'autre?


c'est une bonne solution, mais doit faire attention aux débordements


Réponse x - = y = (x + = y) - y; et dites à l'enseignant qui est l'une des questions la plus lamestes de tous les temps.


@Amadan Sauf quand les gens utilisent des choses comme celles-ci comme des questions astuces lors des interviews, comme si cela s'est avéré quelque chose ...: /



2
votes

Une autre manière populaire est la stratégie d'échange XOR. http://en.wikipedia.org/wiki/xor_swap_algorithm


0 commentaires

1
votes

Ici, nous avons ceci dans MIPS assembleur. La première solution est longue et mauvaise. Le second avec XOR est meilleur.

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


0 commentaires

6
votes

Selon le type de variable, vous pouvez utiliser Interverrouillé.Exchange . Cela utilise une opération atomique pour faire le swap.


0 commentaires

4
votes
 int x = 15;
 int y = 5;

 x = x + y;
 y = x - y;
 x = x - y; 

0 commentaires

14
votes

Vous pouvez y parvenir avec XOR

int A = ...;
int B = ...;
A = A ^ B;
B = A ^ B;
A = A ^ B;


2 commentaires

@Bertrand, je viens de faire un "test d'esprit" et je crois toujours que ça va bien. Si un équivaut à B, dans la première affectation, le résultat d'un 0, alors b est attribué à 0 xor B qui est B, puis a est attribué 0 Xor B qui est à nouveau (ce qui était égal au démarrage A) .


A = 1, b = 1. Étape 1: A = A ^ b = 1 ^ 1 = 0. Étape 2: B = A ^ b = 0 ^ 1 = 1. Étape 3: A = A ^ b = 0 ^ 1 = 1. On dirait que ça m'efforce.