2011-12-26 6 views
10

¿Hay alguna possiblty para intercambiar tres números en una sola instrucciónpermutación de tres cifras del Estado de Individual

Ej:

  • a = 10
  • b = 20
  • c = 30

Quiero que los valores se cambien según la siguiente lista

a = 20 
b = 30 
c = 10 

¿Se pueden transferir estos valores en una sola línea?

+0

¿Es esta una pregunta de la entrevista? –

+0

Sí Sergei Se preguntó en una entrevista – Prabhu

+0

la pregunta de la entrevista no mencionaba ningún lenguaje de programación? –

Respuesta

2

Encontré otra solución para esta pregunta.

Puede usar esto en muchos idiomas, como C,C++ and Java.

Funciona para float y long también.

a=(a+b+c) - (b=c) - (c=a); 
+0

Orden de evaluación en no especificado ... –

1

Como no especificó el idioma, escogeré uno de mi elección. Es Ruby.

[email protected]$ irb 
1.9.3p0 :001 > a = 10 
=> 10 
1.9.3p0 :002 > b = 20 
=> 20 
1.9.3p0 :003 > c = 30 
=> 30 
1.9.3p0 :004 > a, b, c = b, c, a # <== transfer is happening here 
=> [20, 30, 10] 
1.9.3p0 :005 > a 
=> 20 
1.9.3p0 :006 > b 
=> 30 
1.9.3p0 :007 > c 
=> 10 
+0

OP solicitó C ... –

+2

No había C en la lista de etiquetas original. –

+0

De hecho. Pero ahora está. Tal vez la respuesta debería eliminarse ahora que la pregunta ha sido aclarada. –

7
$ python 
>>> a, b, c = 10, 20, 30 
>>> print a, b, c 
10 20 30 
>>> a, b, c = b, c, a 
>>> print a, b, c 
20 30 10 
+0

OP solicitó C ... –

+4

No había C en la lista de etiquetas original. –

+0

@Sergei: De hecho. Pero ahora está. Tal vez la respuesta debería eliminarse ahora que la pregunta ha sido aclarada. –

5

solución en C#. Primero use xor swap a y b. El resultado de la asignación es el valor asignado, en este caso b es la variable más a la izquierda por lo que se devuelve como resultado de (b ^= a^(a ^= b ^= a)). A continuación, cambie c y busing the same algorithm. :)

  int a = 10; 
      int b = 20; 
      int c = 30; 
      c ^= (b ^= a^(a ^= b ^= a))^(b ^= c ^= b); 
+0

¿Ejecutó esto? En ruby ​​eso no es válido. –

+1

que obviamente no es ruby ​​... ni python tampoco ... solo hay un tipo de lenguaje lo suficientemente defectuoso como para permitir la asignación dentro de una expresión: C o uno de sus derivados (igualmente defectuoso). –

+1

Pensé que, sí :-) Pero como ruby ​​tiene la misma operación, lo intenté allí. '(b^= (a^= (b^= a)))^= c', ¿cuál será el resultado de la parte izquierda? Mi sentimiento me dice que es valioso, no variable. –

3

Um, me gustan estas cosas lógicas, mi solución:

a= b+c-((b=c)+(c=a))+c; 

BTW: He probado que (En realidad el uso de JS) y el trabajo con los números :)

Editar:

probé con & decimales negativos y trabajando también :)

+4

-1: Comportamiento no especificado ... la orden de evaluación de sub-expresión no está especificada. – pmg

+0

@pmg ¡Ja! A qué te refieres !! –

+0

El compilador puede elegir hacer las expresiones secundarias en el orden que quiera: por ejemplo, puede hacer '(c = a)' antes '(b = c)' que haría que a 'b' se le asignara el valor en' a '. – pmg

4

Hacer uso del operador coma ...

a = 10; 
b = 20; 
c = 30; 
/* one statement */ 
tmp = a, a = b, b = c, c = tmp; /* assumes tmp has been declared */ 
assert(a == 20); 
assert(b == 30); 
assert(c == 10); 
+1

+1: única respuesta correcta hasta el momento. Pero para una respuesta realmente sombría, podría combinar el operador de coma con el intercambio XOR, para eliminar 'tmp'. 'a^= b, b^= a, a^= b, b^= c, c^= b, b^= c;' ... –

+0

¡Asume! que si no declarado! eso hará que su código 2 líneas (en algunos lenguajes de programación) no solo, y la pregunta es clara, usted tiene estos 3 números! para intercambiar 3 variables –

+0

@ Al-Mothafar: sin embargo, funciona con estas definiciones: 'int a = 10; doble b = 20; char c = 30; 'y la declaración' float tmp; '. Ninguna otra sugerencia lo hace. – pmg

6

Ésta es una pregunta tonta. Pero aquí es la única respuesta (hasta ahora) que es a la vez C bien definido y verdaderamente una sola línea:

a ^= b, b ^= a, a ^= b, b ^= c, c ^= b, b ^= c; 

Utiliza la XOR swap algorithm, correctamente.

Nota: Esto supone que a, bc y son todos del mismo tipo entero (la pregunta no especifica).

+0

'doble a = 10; char b = 20; int c = 30; 'hehehe – pmg

+0

@pmg: Ah, ese es un punto justo. El OP no especificó que todos eran del mismo tipo. –

+0

Downvoters: ¿me gustaría comentar? –

0

Trate escenario diferente: Ej:

a = 10 
b = 20 
c = 30 

a= a+b+c; 
b=a-b-c; 
c=a-b-c; 
a=a-b-c; 

Para n número de,

a = 10 
b = 20 
c = 30 
. 
. 
. 
n 


a= a+b+c+......+n; 
b=a-b-c-.......-n; 
c=a-b-c-.......-n; 
. 
. 
. 
n=a-b-c-.......-n; 
a=a-b-c-.......-n; 
Cuestiones relacionadas