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; // swamping 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; // swamping 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[:] # swaping 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; // swamping 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 |
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++
// 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(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
# 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[r_indx]) > 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 */ |
Output:
987 94658 5132