Open In App

Largest number with one swap allowed

Last Updated : 25 Apr, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

Given a positive integer, find the largest number that could be generated by swapping only two digits at most once.
Examples: 
 

Input: 2736
Output : 7236
Explanation:
If we swap the number 2 and the number
7 then the generated number would be 
the largest number.

Input : 432
Output : 432
Explanation:
Here, no swap is required. The given
number is already largest.

 

Approach 1 (Trying every pair): 
We convert the number to a string. For each digit of the number, we will swap with positions (i, j) and store it as temp check if the temp is larger than number. If yes then swap back to restore the original number.
 

C++




// code to find largest number with
// given conditions.
 
#include <bits/stdc++.h>
using namespace std;
 
// function to find the largest number
// with given conditions.
int largestNum(int num)
{
    // converting the number to the string
    string num_in_str = to_string(num);
    string temp = num_in_str;
 
    // swapping each digit
    for (int i = 0; i < num_in_str.size(); i++) {
        for (int j = i + 1; j < num_in_str.size(); j++) {
 
            // Swapping and checking for the larger
            swap(num_in_str[i], num_in_str[j]);
            if (stoi(num_in_str) > stoi(temp))
                temp = num_in_str;
 
            // Reverting the changes
            swap(num_in_str[i], num_in_str[j]);
        }
    }
 
    return stoi(temp);
}
 
// driver function
int main()
{
    int num = 432;
    cout << largestNum(num) << endl;
    num = 2736;
    cout << largestNum(num) << endl;
    num = 4596;
    cout << largestNum(num) << endl;
    return 0;
}


Java




// Java code to find largest number
// with given conditions.
public class LargestNumber {
 
    static String swap(String str, int i, int j)
    {
        char ch[] = str.toCharArray();
        char temp = ch[i];
        ch[i] = ch[j];
        ch[j] = temp;
        String c = String.valueOf(ch);
        return c;
    }
 
    // function to find the largest number
    // with given conditions.
    static int largestNum(int num)
    {
        // converting the number to the string
        String num_in_str = "" + num;
        String temp = num_in_str;
 
        // swapping each digit
        for (int i = 0; i < num_in_str.length(); i++) {
            for (int j = i + 1; j < num_in_str.length();
                 j++) {
 
                // Swapping and checking for the larger
                num_in_str = swap(num_in_str, i, j);
                if (temp.compareTo(num_in_str) < 0)
                    temp = num_in_str;
 
                // Reverting the changes
                num_in_str = swap(num_in_str, i, j);
            }
        }
 
        return Integer.parseInt(temp);
    }
 
    // Driver code
    public static void main(String[] s)
    {
        int num = 423;
        System.out.println(largestNum(num));
        num = 2736;
        System.out.println(largestNum(num));
        num = 4596;
        System.out.println(largestNum(num));
    }
}
 
// This code is contributed by Prerena Saini


Python3




# python3 code to find the largest
# number with given conditions.
 
# function to find the largest number
def largestNum(num):
 
    # converting the number to the list
    num_to_str = list(str(num))
    temp = num_to_str[:]
 
    # swapping each digit and check for
    # the largest number
    for i in range(len(num_to_str)):
        for j in range(i + 1, len(num_to_str)):
 
            // Swapping current pair
            num_to_str[i], num_to_str[j] = num_to_str[j], num_to_str[i]
            if num_to_str > temp:
                temp = num_to_str[:]
 
            # Reverting above change before next iteration
            num_to_str[i], num_to_str[j] = num_to_str[j], num_to_str[i]
 
    # returning the largest number.
    return int("".join(temp))
 
# main function
def main():
    A = int(432)
    print(largestNum(A))
    A = int(2736)
    print(largestNum(A))
    A = int(4596)
    print(largestNum(A))
 
# calling main function
if __name__=="__main__":
    main()


C#




// C# code to find largest number
// with given conditions.
using System;
 
public class LargestNumber {
 
    static String swap(String str, int i, int j)
    {
        char[] ch = str.ToCharArray();
        char temp = ch[i];
        ch[i] = ch[j];
        ch[j] = temp;
        String c = String.Join("", ch);
        return c;
    }
 
    // function to find the largest number
    // with given conditions.
    static int largestNum(int num)
    {
        // converting the number to the string
        String num_in_str = "" + num;
        String temp = num_in_str;
 
        // swapping each digit
        for (int i = 0; i < num_in_str.Length; i++) {
            for (int j = i + 1; j < num_in_str.Length;
                 j++) {
 
                // Swapping and checking for the larger
                num_in_str = swap(num_in_str, i, j);
                if (temp.CompareTo(num_in_str) < 0)
                    temp = num_in_str;
 
                // Reverting the changes
                num_in_str = swap(num_in_str, i, j);
            }
        }
        return Convert.ToInt32(temp);
    }
 
    // Driver code
    public static void Main(String[] s)
    {
        int num = 423;
        Console.WriteLine(largestNum(num));
        num = 2736;
        Console.WriteLine(largestNum(num));
        num = 4596;
        Console.WriteLine(largestNum(num));
    }
}
 
// This code is contributed by 29AjayKumar


Javascript




<script>
 
// JavaScript code to find largest number with
// given conditions.
 
// function to find the largest number
// with given conditions.
function largestNum(num)
{
    // converting the number to the string
    var num_in_str = (num.toString().split(''));
    var temp = JSON.parse(JSON.stringify(num_in_str));
 
    // swapping each digit
    for (var i = 0; i < num_in_str.length; i++) {
        for (var j = i + 1; j < num_in_str.length; j++)
        {
 
            // Swapping and checking for the larger
            [num_in_str[i], num_in_str[j]] =
            [num_in_str[j], num_in_str[i]];
            if (parseInt(num_in_str.join('')) >
                parseInt(temp.join('')))
                temp =
                JSON.parse(JSON.stringify(num_in_str));
 
            // Reverting the changes
            [num_in_str[i], num_in_str[j]] =
            [num_in_str[j], num_in_str[i]];
        }
    }
 
    return parseInt(temp.join(''));
}
 
// driver function
 
var num = 432;
document.write( largestNum(num) + "<br>");
num = 2736;
document.write( largestNum(num) + "<br>");
num = 4596;
document.write( largestNum(num) + "<br>");
 
</script>


Output:  

432
7236
9546

Time complexity :- O(N^2)

Space complexity :- O(1)

Approach 2 (Efficient) : 
We will scan the number from backward direction. In the scan, if the ith digit is the largest by far, store it and its index or if the current digit is smaller than the largest digit recorded by far, this digit and the largest digit are the best suitable for swap.
Below is the implementation of the above approach. 
 

C++




// code to find largest number with
// given conditions.
#include <bits/stdc++.h>
using namespace std;
 
// function to find the largest number
// with given conditions.
int largestNum(int num)
{
    int max_digit = -1;
    int max_digit_indx = -1;
    int l_indx = -1;
    int r_indx = -1;
 
    // converting the number to string
    string num_in_str = to_string(num);
    for (int i = num_in_str.size() - 1; i >= 0; i--) {
 
        // current digit is the largest by far
        if (num_in_str[i] > max_digit) {
            max_digit = num_in_str[i];
            max_digit_indx = i;
            continue;
        }
 
        // best digit for swap if there is no more
        // such situation on the left side
        if (num_in_str[i] < max_digit) {
            l_indx = i;
            r_indx = max_digit_indx;
        }
    }
 
    // check for is number already in order
    if (l_indx == -1)
        return num;
 
    swap(num_in_str[l_indx], num_in_str[r_indx]);
 
    return stoi(num_in_str);
}
 
// driver function
int main()
{
    int num = 789;
    cout << largestNum(num) << endl;
    num = 49658;
    cout << largestNum(num) << endl;
    num = 2135;
    cout << largestNum(num) << endl;
    return 0;
}


Java




// Java to find largest number with
// given conditions.
class GFG {
 
    // function to find the largest number
    // with given conditions.
    static int largestNum(int num)
    {
        int max_digit = -1;
        int max_digit_indx = -1;
        int l_indx = -1;
        int r_indx = 1;
 
        // converting the number to string
        String num_in_str = String.valueOf(num);
        for (int i = num_in_str.length() - 1; i >= 0; i--) {
            // current digit is the largest by far
            if (num_in_str.charAt(i) > max_digit) {
                max_digit = num_in_str.charAt(i);
                max_digit_indx = i;
                continue;
            }
 
            // best digit for swap if there is no more
            // such situation on the left side
            if (num_in_str.charAt(i) < max_digit) {
                l_indx = i;
                r_indx = max_digit_indx;
            }
        }
 
        // check for is number already in order
        if (l_indx == -1)
            return num;
 
        num_in_str = swap(num_in_str, l_indx, r_indx);
 
        return Integer.parseInt(num_in_str);
    }
    static String swap(String arr, int i, int j)
    {
        char temp[] = arr.toCharArray();
        char c = temp[i];
        temp[i] = temp[j];
        temp[j] = c;
        return String.valueOf(temp);
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int num = 789;
        System.out.println(largestNum(num));
        num = 49658;
        System.out.println(largestNum(num));
        num = 2135;
        System.out.println(largestNum(num));
    }
}
 
// This code contributed by Rajput-Ji


Python3




# Python3 to find largest number with
# given conditions.
 
# Function to find the largest number
# with given conditions.
def largestNum(num):
    max_digit = -1
    max_digit_indx = -1
    l_indx = -1
    r_indx = 1
 
    # converting the number to string
    num_in_str = list(str(num))
    for i in range(len(num_in_str) - 1, -1, -1):
         
        # current digit is the largest by far
        if int(num_in_str[i]) > int(max_digit):
            max_digit = num_in_str[i]
            max_digit_indx = i
            continue
 
        # best digit for swap if there is no more
        # such situation on the left side
        if int(num_in_str[i]) < int(max_digit):
            l_indx = i
            r_indx = max_digit_indx
 
    # check for is number already in order
    if l_indx == -1:
        return num
 
    num_in_str[l_indx], num_in_str[r_indx] = \
    num_in_str[r_indx], num_in_str[l_indx]
 
    return int(''.join(num_in_str))
 
# Driver Code
num = 789
print(largestNum(num))
num = 49658
print(largestNum(num))
num = 2135
print(largestNum(num))
 
# This code is contributed by Gowtham Yuvaraj


C#




// C# to find largest number with
// given conditions.
using System;
 
class GFG {
 
    // function to find the largest number
    // with given conditions.
    static int largestNum(int num)
    {
        int max_digit = -1;
        int max_digit_indx = -1;
        int l_indx = -1;
        int r_indx = 1;
 
        // converting the number to string
        String num_in_str = String.Join("", num);
        for (int i = num_in_str.Length - 1; i >= 0; i--) {
            // current digit is the largest by far
            if (num_in_str[r_indx] > max_digit) {
                max_digit = num_in_str[i];
                max_digit_indx = i;
                continue;
            }
 
            // best digit for swap if there is no more
            // such situation on the left side
            if (num_in_str[i] < max_digit) {
                l_indx = i;
                r_indx = max_digit_indx;
            }
        }
 
        // check for is number already in order
        if (l_indx == -1)
            return num;
 
        num_in_str = swap(num_in_str, l_indx, r_indx);
 
        return int.Parse(num_in_str);
    }
    static String swap(String arr, int i, int j)
    {
        char[] temp = arr.ToCharArray();
        char c = temp[i];
        temp[i] = temp[j];
        temp[j] = c;
        return String.Join("", temp);
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        int num = 789;
        Console.WriteLine(largestNum(num));
        num = 49658;
        Console.WriteLine(largestNum(num));
        num = 2135;
        Console.WriteLine(largestNum(num));
    }
}
 
/* This code contributed by PrinciRaj1992 */


Javascript




// JavaScript program to find largest number with given conditions.
 
// Function to find the largest number with given conditions.
function largestNum(num) {
let max_digit = -1;
let max_digit_indx = -1;
let l_indx = -1;
let r_indx = 1;
 
// Converting the number to string
let num_in_str = num.toString().split('');
for (let i = num_in_str.length - 1; i >= 0; i--) {
// Current digit is the largest by far
if (parseInt(num_in_str[i]) > parseInt(max_digit)) {
max_digit = num_in_str[i];
max_digit_indx = i;
continue;
}
 
 
// Best digit for swap if there is no more such situation on the left side
if (parseInt(num_in_str[i]) < parseInt(max_digit)) {
  l_indx = i;
  r_indx = max_digit_indx;
}
}
 
// Check for whether the number is already in order
if (l_indx == -1) {
return num;
}
 
[num_in_str[l_indx], num_in_str[r_indx]] = [num_in_str[r_indx], num_in_str[l_indx]];
 
return parseInt(num_in_str.join(''));
}
 
// Driver Code
let num = 789;
console.log(largestNum(num));
num = 49658;
console.log(largestNum(num));
num = 2135;
console.log(largestNum(num));


Output:  

987
94658
5132

 



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads