Open In App

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

Improve
Improve
Like Article
Like
Save
Share
Report

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

Examples : 

Input: 1235785
Output: 1535782
Explanation: Swap 2 and 5.

Input: 536425
Output:  536524
Explanation: 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 the 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.

Implementation:

C++




// 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;
}


Java




// 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*/


Python3




# 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


C#




// 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*/


PHP




<?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
?>


Javascript




<script>
    // Javascript program for above implementation
      
    // Make the largest even number 
    function makeEven(string) {
        let str = string.split('');
        let n = str.length;
        let even = Number.MAX_VALUE, index = 0;
    
        // Start traversing the String 
        for (let i = 0; i < n - 1; i++) {
    
            // Find the even number 
            if ((str[i].charCodeAt() - '0'.charCodeAt()) % 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].charCodeAt() - '0'.charCodeAt())) {
                break;
            }
        }
    
        // Return original String if there is no 
        // even value 
        if (even == Number.MAX_VALUE) {
            return str;
        }
    
        // Swap even and odd value 
        swap(str,index, n - 1);
    
        return str.join("");
    }
      
    function swap(str, index1, index2)
    {
      let temp = str[index1];
      str[index1] = str[index2];
      str[index2] =temp;
    }
      
    let str = "1356425";
      document.write(makeEven(str));
      
</script>


Output

1356524

Time Complexity: O(N)
Auxiliary Space: O(1)

 



Last Updated : 15 Sep, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads