Next higher number using atmost one swap operation
Last Updated :
15 Dec, 2022
Given a non-negative number num. The problem is to find the smallest number greater than num by performing atmost on swap operation between any two digits in num. If no larger number can be formed then print “Not Possible”.
The number could be very large and may not even fit into long long int.
Examples:
Input : num = “218765”
Output : 258761
Explanation: We swap 5 and 1 to get the smallest number greater than ‘num’
Input : num = “541322”
Output : 542312
Approach: First find the index of the rightmost digit which has a digit larger than it and is on the right side to it. Let its index be ind. Now, find the index of the smallest digit greater than the digit at index ind and is right to it. Let its index be greatSmallDgt. Finally swap the digits at the indexes ind and greatSmallDgt. If the digits of num are in decreasing order then print “Not Possible”.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
string nxtHighUsingAtMostOneSwap(string num)
{
int l = num.size();
int posRMax = l - 1;
int index = -1;
for ( int i = l - 2; i >= 0; i--) {
if (num[i] >= num[posRMax])
posRMax = i;
else {
index = i;
break ;
}
}
if (index == -1)
return "Not Possible" ;
int greatSmallDgt = -1;
for ( int i = l - 1; i > index; i--) {
if (num[i] > num[index]) {
if (greatSmallDgt == -1)
greatSmallDgt = i;
else if (num[i] <= num[greatSmallDgt])
greatSmallDgt = i;
}
}
char temp = num[index];
num[index] = num[greatSmallDgt];
num[greatSmallDgt] = temp;
return num;
}
int main()
{
string num = "218765" ;
cout << "Original number: " << num << endl;
cout << "Next higher number: "
<< nxtHighUsingAtMostOneSwap(num);
return 0;
}
|
Java
import java.io.*;
public class GFG{
static String nextHighUsingAtMostOneSwap(String st)
{
char num[] = st.toCharArray();
int l = num.length;
int posRMax = l - 1 ;
int index = - 1 ;
for ( int i = l - 2 ; i >= 0 ; i--)
{
if (num[i] >= num[posRMax])
posRMax = i;
else
{
index = i;
break ;
}
}
if (index == - 1 )
return "Not Possible" ;
int greatSmallDgt = - 1 ;
for ( int i = l - 1 ; i > index; i--)
{
if (num[i] > num[index])
{
if (greatSmallDgt == - 1 )
greatSmallDgt = i;
else if (num[i] <= num[greatSmallDgt])
greatSmallDgt = i;
}
}
char temp = num[index];
num[index] = num[greatSmallDgt];
num[greatSmallDgt] = temp;
return (String.valueOf(num));
}
public static void main(String[] args)
{
String num = "218765" ;
System.out.println( "Original number: "
+ num );
System.out.println( "Next higher number: "
+ nextHighUsingAtMostOneSwap(num));
}
}
|
Python
def nextHighUsingAtMostOneSwap(st) :
num = list (st)
l = len (num)
posRMax = l - 1
index = - 1
i = l - 2
while i > = 0 :
if (num[i] > = num[posRMax]) :
posRMax = i
else :
index = i
break
i = i - 1
if (index = = - 1 ) :
return "Not Possible"
greatSmallDgt = - 1
i = l - 1
while i > index :
if (num[i] > num[index]) :
if (greatSmallDgt = = - 1 ) :
greatSmallDgt = i
elif (num[i] < = num[greatSmallDgt]) :
greatSmallDgt = i
i = i - 1
temp = num[index]
num[index] = num[greatSmallDgt];
num[greatSmallDgt] = temp;
return ''.join(num)
num = "218765"
print "Original number: " , num
print "Next higher number: " , nextHighUsingAtMostOneSwap(num)
|
C#
using System;
class GFG
{
static String nextHighUsingAtMostOneSwap(String st)
{
char [] num = st.ToCharArray();
int l = num.Length;
int posRMax = l - 1;
int index = -1;
for ( int i = l - 2; i >= 0; i--)
{
if (num[i] >= num[posRMax])
posRMax = i;
else
{
index = i;
break ;
}
}
if (index == -1)
return "Not Possible" ;
int greatSmallDgt = -1;
for ( int i = l - 1; i > index; i--)
{
if (num[i] > num[index])
{
if (greatSmallDgt == -1)
greatSmallDgt = i;
else if (num[i] <= num[greatSmallDgt])
greatSmallDgt = i;
}
}
char temp = num[index];
num[index] = num[greatSmallDgt];
num[greatSmallDgt] = temp;
string res = new string (num);
return res;
}
public static void Main()
{
String num = "218765" ;
Console.WriteLine( "Original number: "
+ num );
Console.WriteLine( "Next higher number: "
+ nextHighUsingAtMostOneSwap(num));
}
}
|
PHP
<?php
function nxtHighUsingAtMostOneSwap( $num )
{
$l = strlen ( $num );
$posRMax = $l - 1;
$index = -1;
for ( $i = $l - 2; $i >= 0; $i --)
{
if ( $num [ $i ] >= $num [ $posRMax ])
$posRMax = $i ;
else
{
$index = $i ;
break ;
}
}
if ( $index == -1)
return "Not Possible" ;
$greatSmallDgt = -1;
for ( $i = $l - 1;
$i > $index ; $i --)
{
if ( $num [ $i ] > $num [ $index ])
{
if ( $greatSmallDgt == -1)
$greatSmallDgt = $i ;
else if ( $num [ $i ] <= $num [ $greatSmallDgt ])
$greatSmallDgt = $i ;
}
}
$temp = $num [ $index ];
$num [ $index ] = $num [ $greatSmallDgt ];
$num [ $greatSmallDgt ] = $temp ;
return $num ;
}
$num = "218765" ;
echo "Original number: " . $num . "\n" ;
echo "Next higher number: " .
nxtHighUsingAtMostOneSwap( $num );
?>
|
Javascript
<script>
function nextHighUsingAtMostOneSwap(st)
{
var num = st.split( '' );
var l = num.length;
var posRMax = l - 1;
var index = -1;
for ( var i = l - 2; i >= 0; i--)
{
if (num[i] >= num[posRMax])
posRMax = i;
else
{
index = i;
break ;
}
}
if (index == -1)
return "Not Possible" ;
var greatSmallDgt = -1;
for ( var i = l - 1; i > index; i--)
{
if (num[i] > num[index])
{
if (greatSmallDgt == -1)
greatSmallDgt = i;
else if (num[i] <= num[greatSmallDgt])
greatSmallDgt = i;
}
}
var temp = num[index];
num[index] = num[greatSmallDgt];
num[greatSmallDgt] = temp;
return (num.join( '' ));
}
var num = "218765" ;
document.write( "Original number: "
+ num );
document.write( "<br>Next higher number: "
+ nextHighUsingAtMostOneSwap(num));
</script>
|
Output
Original number: 218765
Next higher number: 258761
Time Complexity: O(n), where n is the number of digits in num.
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...