Largest even number possible by using one swap operation in given number

Given an odd number in the form of a string, the task is to make largest even number from the given number and you are allowed to do only one swap operation.

Examples :

Input : 1235785
Output :1535782
Swap 2 and 5.

Input :  536425
Output :  536524
Swap 4 and 5 to make the largest even number.



  1. Find the first even number less than or equal to the odd number at last index.
  2. If found, swap both values. Else swap with the last even value in the string.
  3. If not possible to make even, print the given string.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for above implementation
#include <bits/stdc++.h>
using namespace std;
  
// Make the largest even number
string makeEven(string str)
{
    int n = str.length();
    int even = INT_MAX, index;
  
    // Start traversing the string
    for (int i = 0; i < n - 1; i++) {
  
        // Find the even number
        if ((str[i] - '0') % 2 == 0) {
            even = (str[i] - '0');
            index = i;
        }
  
        // Check if current even is equal to
        // or less than the odd number
        if (even <= (str[n - 1] - '0'))
            break;
    }
  
    // Return original string if there is no
    // even value
    if (even == INT_MAX)
        return str;
  
    // Swap even and odd value
    swap(str[index], str[n - 1]);
  
    return str;
}
  
// Driver code
int main()
{
    string str = "1356425";
    cout << makeEven(str);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for above implementation
  
class GFG {
  
// Make the largest even number 
    static char[] makeEven(String string) {
        char []str = string.toCharArray();
        int n = str.length;
        int even = Integer.MAX_VALUE, index = 0;
  
        // Start traversing the String 
        for (int i = 0; i < n - 1; i++) {
  
            // Find the even number 
            if ((str[i] - '0') % 2 == 0) {
                even = (str[i] - '0');
                index = i;
            }
  
            // Check if current even is equal to 
            // or less than the odd number 
            if (even <= (str[n-1] - '0')) {
                break;
            }
        }
  
        // Return original String if there is no 
        // even value 
        if (even == Integer.MAX_VALUE) {
            return str;
        }
  
        // Swap even and odd value 
        swap(str,index, n - 1);
  
        return str;
    }
static void swap(char[] str,int index1,int index2){
    char temp = str[index1];
    str[index1] = str[index2];
    str[index2] =temp;
}
// Driver code 
    public static void main(String[] args) {
        String str = "1356425";
        System.out.print(makeEven(str));
    }
}
/*This code is contributed by PrinciRaj1992*/

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 code for the above implementation
import sys
  
# Make the largest even number
def makeEven(arr, n):
      
    # index to first even no,if any
    first_e_i = -1
      
    # index to last even no, if any
    last_e_i = -1
      
    # index to last no
    last_n_i = n - 1
  
    # Start traversing the String 
    for i in range(n):
  
        # if it finds any first even no less 
        # than last digit then break the loop
        if (int(arr[i]) % 2 == 0 and 
            int(arr[i]) < int(arr[last_n_i])):
            first_e_i = i
            break
              
        # it finds last even no
        if int(arr[i]) % 2 == 0:
            last_e_i = i
    if first_e_i != -1:
          
        # swap even and odd value
        (arr[first_e_i], 
         arr[last_n_i]) = (arr[last_n_i], 
                           arr[first_e_i])
        return arr
    if first_e_i == -1 and last_e_i != -1:
          
        # swap even and odd value
        (arr[last_e_i], 
         arr[last_n_i]) = (arr[last_n_i], 
                           arr[last_e_i])
        return arr
          
    # Return original String if there is 
    # no even number
    return arr     
  
# Driver Code
if __name__=='__main__':
    string="1356425"
    result = "".join(makeEven(list(string),
                          len(list(string))))
    print(result)
   
# This code is contributed
# by Vikash Kumar 37

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of above approach
using System; 
  
public class GFG { 
   
// Make the largest even number 
    static char[] makeEven(String str1) {
        char []str = str1.ToCharArray();
        int n = str.Length;
        int even = int.MaxValue, index = 0;
   
        // Start traversing the String 
        for (int i = 0; i < n - 1; i++) {
   
            // Find the even number 
            if ((str[i] - '0') % 2 == 0) {
                even = (str[i] - '0');
                index = i;
            }
   
            // Check if current even is equal to 
            // or less than the odd number 
            if (even <= (str[n-1] - '0')) {
                break;
            }
        }
   
        // Return original String if there is no 
        // even value 
        if (even == int.MaxValue) {
            return str;
        }
   
        // Swap even and odd value 
        swap(str,index, n - 1);
   
        return str;
    }
static void swap(char[] str,int index1,int index2){
    char temp = str[index1];
    str[index1] = str[index2];
    str[index2] =temp;
}
// Driver code 
    public static void Main() {
        String str = "1356425";
        Console.WriteLine(makeEven(str));
    }
}
/*This code is contributed by PrinciRaj1992*/

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program for above implementation
  
// Make the largest even number
function makeEven($str)
{
    $n = strlen($str);
    $even = PHP_INT_MAX; $index;
  
    // Start traversing the string
    for ($i = 0; $i < $n - 1; $i++) 
    {
  
        // Find the even number
        if (($str[$i] - '0') % 2 == 0)
        {
            $even = ($str[$i] - '0');
            $index = $i;
        }
  
        // Check if current even is 
        // equal to or less than 
        // the odd number
        if ($even <= ($str[$n - 1] - '0'))
            break;
    }
  
    // Return original string if 
    // there is no even value
    if ($even == PHP_INT_MAX)
        return $str;
  
    //swap the number 
    list($str[$index], 
         $str[$n - 1]) = array($str[$n - 1], 
                               $str[$index]);
    return $str;
}
  
// Driver code
$str = "1356425";
echo makeEven($str);
  
// This code is contributed by ajit
?>

chevron_right



Output :

1356524

Time Complexity : O(N)

This article is contributed by Sahil Chhabra. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up