Largest number with one swap allowed - GeeksforGeeks

12 May, 2022
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++
Java
Python3
C#
Javascript
// 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 functionint main(){    int num = 432;    cout << largestNum(num) << endl;    num = 2736;    cout << largestNum(num) << endl;    num = 4596;    cout << largestNum(num) << endl;    return 0;}
// 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 code to find the largest# number with given conditions. # function to find the largest numberdef 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 functiondef main():    A = int(432)    print(largestNum(A))    A = int(2736)    print(largestNum(A))    A = int(4596)    print(largestNum(A)) # calling main functionif __name__=="__main__":    main()
// 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
<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
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++
Java
Python3
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 functionint main(){    int num = 789;    cout << largestNum(num) << endl;    num = 49658;    cout << largestNum(num) << endl;    num = 2135;    cout << largestNum(num) << endl;    return 0;}
// 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(r_indx) > 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 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 Codenum = 789print(largestNum(num))num = 49658print(largestNum(num))num = 2135print(largestNum(num)) # This code is contributed by Gowtham Yuvaraj
// 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 */
Output:  
987
94658
5132
 
29AjayKumar
Rajput-Ji
princiraj1992
gowtham_yuvaraj
rutvik_56
saurabh1990aror
prashantverma3
large-numbers
number-digits
Competitive Programming
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Prefix Sum Array - Implementation and Applications in Competitive Programming
Ordered Set and GNU C++ PBDS
Modulo 10^9+7 (1000000007)
What is Competitive Programming and How to Prepare for It?
Bits manipulation (Important tactics)
7 Best Coding Challenge Websites in 2020
Multistage Graph (Shortest Path)
Formatted output in Java
Algorithm Library | C++ Magicians STL Algorithm
Use of FLAG in programming