How to swap two numbers without using temp or third variable is common
interview question not just on Java interviews but also on C and C++
interviews. It is also a good programming questions for freshers.
This question was asked to me long back and didn't had any idea about how to
approach this question without using temp or third variable, may be lack of knowledge
on bitwise operators in Java or may be it didn't click at that time. Given some
time and trial error, I eventually come out with a solution with just
arithmetic operator but interviewer was keep asking about other approaches of

*swapping two variables without using temp or third variable*. Personally, I liked this question and included in list of my programming interview question because of its simplicity and some logical work, it force you to do. When learned bit-wise operation in Java I eventually find another way of swapping two variables without third variable, which I am going to share with you guys.##
__Swapping two numbers without using temp variable in Java__

If you have ever heard this question, then you must be familiar with this
approach of swapping numbers without using temp variable. If you are hearing it
first time, then try it yourself, its a good programming exercise for
absolute first timer. By the way, here is the code example of swapping two
numbers without using temp variable and using arithmetic operator in Java:

int a = 10;

int b = 20;

System.out.println("value of a and b before swapping, a: " + a +" b: " + b);

*//*

*swapping value of two numbers without using temp variable*

a = a+ b;

*//**now a is 30 and b is 20*
b = a -b;

*//**now a is 30 but b is 10 (original value of a)*
a = a -b;

*//**now a is 20 and b is 10, numbers are swapped*
System.out.println("value of a and b after swapping, a: " + a +" b: " + b);

Output:

value of a and b before swapping, a: 10 b: 20

value of a and b after swapping, a: 20 b: 10

##
__Swapping two numbers without using temp
variable in Java with bitwise operator__

Bitwise operators can also be used to swap two numbers without using
third variable. XOR bitwise operator returns zero if both operand is same i.e.
either 0 or 1 and returns 1 if both
operands are different e.g. one operand is zero and other is one. By leveraging this property, we can swap two numbers in Java. Here is code
example of swapping two numbers without using temp variable in Java using XOR
bitwise operand:

A B A^B (A XOR B)

0 0 0 (zero because operands are same)

0 1 1

1 0 1 (one because operands are different)

1 1 0

int a = 2;

*//**0010 in binary*
int b = 4;

*//**0100 in binary*
System.out.println("value of a and b before swapping, a: " + a +" b: " + b);

*//*

*swapping value of two numbers without using temp variable and XOR bitwise operator*

a = a^b;

*//**now a is 6 and b is 4*
b = a^b;

*//**now a is 6 but b is 2 (original value of a)*
a = a^b;

*//**now a is 4 and b is 2, numbers are swapped*
System.out.println("value of a and b after swapping using XOR bitwise operation, a: " + a +" b: " + b);

value of a and b before swapping, a: 2 b: 4

value of a and b after swapping using XOR bitwise
operation, a: 4 b: 2

##
__Swapping two numbers without using temp
variable in Java with division and multiplication__

There is another, third way of swapping two numbers without using third
variable, which involves multiplication and division operator. This is similar
to first approach, where we have used + and - operator for swapping values of
two numbers. Here is the code example to swap tow number without using third
variable with division and multiplication operators in Java :

int a = 6;

int b = 3;

System.out.println("value of a and b before swapping, a: " + a +" b: " + b);

*//*

*swapping value of two numbers without using temp variable using multiplication and division*

a = a*b;

*//**now a is 18 and b is 3*
b = a/b;

*//**now a is 18 but b is 6 (original value of a)*
a = a/b;

*//**now a is 3 and b is 6, numbers are swapped*
System.out.println("value of a and b after swapping using multiplication and division,
a: " + a +" b: " + b);

Output:

value of a and b before swapping, a: 6 b: 3

value of a and b after swapping using multiplication and division,
a: 3 b: 6

That's all on

**3 ways to swap two variables without using third variable in Java**. Its good to know multiple ways of swapping two variables without using temp or third variable to handle any follow-up question. Swapping numbers using bitwise operator is the fastest among three, because it involves bitwise operation. It’s also great way to show your knowledge of bitwise operator in Java and impress interviewer, which then may ask some question on bitwise operation. A nice trick to drive interview on your expert area.
## 33 comments :

As I saw the first method you've explained the first time, I was absolutely amazed.

Thanks for this article. I didn't know the other two ones.

Are there any real world examples where somebody would want to use any of these solutions? Perhaps swapping register contents for context switches within the OS?

Won't there be problem of over-flow in methods 1 & 3 ?

@Hemanth: of course that's the potential problem. That's why better you come with method 2 in the first place, then you can show you know also about 1 & 3, but pointing out the risks.

@Hemanth and @Jozsef, Good point. That's a good thing to point out even during interviews, and probably a good follow up question.

Piece of cake in Python lol

a,b=b,a

While these are neat for things like a programmer's interview question I would be very careful about actually using these in real code, for two reasons:

1. It obfuscates the code for very little benefit. Readability suffers more than performance gains.

The JVM could employ similar tricks under the covers for performance reasons if it detects that this is on the hot path.

2. The code is sensitive to overflow, sign handling, Not-a-Number, and divide-by-zero.

Both these points should be raised by an experienced programmer.

What if "b == 0"? Then "b = a/b" gives a division by zero exception...

"Are there any real world examples where somebody would want to use any of these solutions? "

No, which is why it is a stupid interview question and if your interviewer asks it, you might think twice about taking the job there. Remember an interview is where you decide if you want to work there in addition to the company deciding if they want to hire you.

String a;

String b;

Now do it. Fail.

@Asgeir Storesund Nilsen , I think you raised very important things regarding, overflow, sign handling, and divide by zero. Solution, which involves integer arithmetic always prone to overflow. I guess second solution still fits the bill, what's your thought?

@Anonymous, Yes that's an age case for third solution. Interviewer really likes if you can raise those concerns as well, but you need to back with solution. XOR may help there.

@Anonymous, In real world, I suggest to use temp variable. It's easy, readable and works perfectly.In my opinion, these kind of questions has there place, they make you to think and put your thought on code, point out edge cases, limitations etc. Don't you desire all those quality in anyone joining your team?

@Josef @Hemanth @Javin how could there be overflow in methods 1 & 3? I am new to computer science and just wondering.

@Anonymous1 :

max value of int is 2,147,483,647 in java. So, when you do addition of two large numbers, you might get unexpected values because of over-flow.

@Anonymous2 :

This question was actually asked in my e-bay phone interview.

In Java you can use BigInteger to add extremely lager numbers.

http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigInteger.html

---------------

String a;

String b;

Now do it. Fail.

---------------

String a = "abc";

String b = "def";

System.out.println("\na: " + a + "\nb: " + b);

b = a.length() + "_" + a + b;

System.out.println("\na: " + a + "\nb: " + b);

a = b.substring(Integer.parseInt(b.split("_")[0]) + b.indexOf("_") + 1);

System.out.println("\na: " + a + "\nb: " + b);

b = b.substring(b.indexOf("_") + 1, b.indexOf("_") + 1 + Integer.parseInt(b.split("_")[0]));

System.out.println("\na: " + a + "\nb: " + b);

========

Output:

a: abc

b: def

a: abc

b: 3_abcdef

a: def

b: 3_abcdef

a: def

b: abc

Win.

@Hemanth, first method to swap two number is fine with Integer overflow, because overflow is clearly defined in Java and addition is cumulative operation. I did run with a case which overflow :

//first method

int a = Integer.MAX_VALUE;

int b = 2;

System.out.println("before, a: " + a+ " b: " + b);

a = a + b;

b = a - b;

a = a - b;

System.out.println("after a: " + a + " b: " + b);

This is what I see :

before, a: 2147483647 b: 2

after a: 2 b: 2147483647

On third method, there are couple of problems related to sign and divide by zero, which may come due to integer overflow.

@Anonymous, you can safely use 1st and 2nd code sample to swap two numbers in Java, they are free from Integer overflow. But, don't use this kind of swapping code to actually swap two values, It's not worth. In all cases temp variable should be used to swap numbers including integers, double or any floating point numbers.

Can I use these examples, to swap two numbers without using temp variable, in C, C++ or C#? Actually same question was asked but on C# interview.

What is the point of swapping two variables without temporary variable, making it unreadable, introducing new bugs and wasting CPU?

Another way ....

--------------------------------

import java.util.*;

class StackEx {

public static void main(String args[]) {

int a=10,b=20;

Stack st = new Stack();

st.push(new Integer(a));

st.push(new Integer(b));

System.out.println("b value"+(Integer)st.pop());

System.out.println("a value"+(Integer)st.pop());

}

}

Your Method #2 is one that I first used when doing assembly language progamming . . . in 1973. ;-)

You can achieve same with one liner:

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

How to create a swap function for integers in java as there are no pointers in java and primitive data types are called value , not by reference

if one of the number is negative then what is the logic

guys, there is another alternative too :-

int a = 10;

int b = 20;

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

P.S :- Taken from

https://www.quora.com/Elegant-Code/What-is-the-most-elegant-line-of-code-youve-seen

@Ruks Shetty

String a = "abcdefghijklmno";

String b = "123456787654321";

b = a + b;

a = b.substring(a.length());

b = b.substring(0, b.indexOf(a));

a = b + 0 * (b = a);

From a performance point of view, there is not much merit in doing a swap without using a third variable. If you study the bytecode that's generated for each of the methods, you will probably find that using a temporary variable generates the least number of bytecode instructions (6 as opposed to 12 or more). So, if you have something like this within a tight loop, use a third variable. While it's a cool idea, be sure to mention the downside to your interviewer.

If some interviewer asks me this question I will quit that interview and leave. This is so unreal and so academic if you are not hiring for some very specialised position, not to mention all that problems with overflow, performance etc...

My brain is activelly refusing to waste precious time with problems like this and from my > 10 years programming experience this type of question will tell you nothing about your candidate and his programming skills and experience. And he is often to nervous to solve algorhitmical problems when sweatting in front of interviewer, if he will come up with absoluttely nothing, it doesnt mean he is very smart.

Maybe that only thing you will learn if he will solve that right on place is that he is reading this blog regurally :)

As long as both String a & String b are not null. we can use the following to swap them:

b = a + (a = b).substring(0, 0);

Method 2 is the best method. It uses very little space & is very fast. Method 3 will give a runtime error if b=0.

IIRC, while it's probably pointless on modern hardware, this used to be a way to save space when memory or registers were at a premium (ex. embedded systems, early computers with a few hundred bytes of RAM, etc.).

## Post a Comment