📌  相关文章
📜  使用最多一次交换操作形成最大数目

📅  最后修改于: 2021-04-24 15:04:10             🧑  作者: Mango

给定一个非负数num 。问题是最多对数字num进行一次交换操作,以使结果为最大可能的数字。该数字可能非常大,因此可以使用字符串类型来存储数字。

例子:

Input : n = 8725634
Output : 8765234
Swapped the digits 2 and 6.

Input : n = 54321
Output : 54321
No swapping of digits required.

创建一个数组rightMax []rightMax [i]包含最大数字的索引,该索引位于num [i]的右侧,并且大于num [i] 。如果不存在这样的数字,则rightMax [i] = -1。现在,将rightMax []数组从i = 0遍历到n-1(其中nnum中的位数),并找到第一个具有rightMax [i] = -1的元素。执行swap(num [i],num [rightMax [i]])操作并中断。

C++
// C++ implementation to form the largest number
// by applying atmost one swap operation
#include 
using namespace std;
  
// function to form the largest number by
// applying atmost one swap operation
string largestNumber(string num)
{
    int n = num.size();
    int rightMax[n], right;
  
    // for the rightmost digit, there
    // will be no greater right digit
    rightMax[n - 1] = -1;
  
    // index of the greatest right digit till the
    // current index from the right direction
    right = n - 1;
  
    // traverse the array from second right element
    // up to the left element
    for (int i = n - 2; i >= 0; i--) {
  
        // if 'num[i]' is less than the greatest digit
        // encountered so far
        if (num[i] < num[right])
            rightMax[i] = right;
  
        // else
        else {
            // there is no greater right digit
            // for 'num[i]'
            rightMax[i] = -1;
  
            // update 'right' index
            right = i;
        }
    }
  
    // traverse the 'rightMax[]' array from left to right
    for (int i = 0; i < n; i++) {
  
        // if for the current digit, greater right digit exists
        // then swap it with its greater right digit and break
        if (rightMax[i] != -1) {
  
            // performing the required swap operation
            swap(num[i], num[rightMax[i]]);
            break;
        }
    }
  
    // required largest number
    return num;
}
  
// Driver program to test above
int main()
{
    string num = "8725634";
    cout << "Largest number:"
         << largestNumber(num);
    return 0;
}


Java
//Java implementation to form the largest number
//by applying utmost one swap operation
public class GFG
{
    // function to form the largest number by
    // applying utmost one swap operation
    static String largestNumber(String num)
    {
        int n = num.length();
        int right;
        int rightMax[] = new int[n];
  
        // for the rightmost digit, there
        // will be no greater right digit
        rightMax[n - 1] = -1;
  
        // index of the greatest right digit
        // till the current index from the
        // right direction
        right = n - 1;
  
        // traverse the array from second right
        // element up to the left element
        for (int i = n - 1; i >= 0 ; i--)
        {
            // if 'num.charAt(i)' is less than the
            // greatest digit encountered so far
            if (num.charAt(i) < num.charAt(right))
                rightMax[i] = right;
  
            else
            {
                // there is no greater right digit
                // for 'num.charAt(i)'
                rightMax[i] = -1;
  
                // update 'right' index
                right = i;
            }
        }
  
        // traverse the 'rightMax[]' array from
        // left to right
        for (int i = 0; i < n; i++)
        {
  
            // if for the current digit, greater
            // right digit exists then swap it
            // with its greater right digit and break
            if (rightMax[i] != -1)
            {
                // performing the required swap operation
                num = swap(num,i,rightMax[i]);
                break;
            }
        }
  
        // required largest number
        return num;
    }
  
    // Utility method to swap two characters
    // in a String
    static String swap(String num, int i, int j)
    {
        StringBuilder sb= new StringBuilder(num);
        sb.setCharAt(i, num.charAt(j));
        sb.setCharAt(j, num.charAt(i));
        return sb.toString();
  
    }
  
    //Driver Function to test above Function
    public static void main(String[] args)
    {
        String num = "8725634";
        System.out.println("Largest Number : " +
                              largestNumber(num));
    }
  
}
//This code is contributed by Sumit Ghosh


Python
# Python implementation to form the largest number
# by applying atmost one swap operation
  
# function to form the largest number by
# applying atmost one swap operation
def largestNumber(num):
    n = len(num)
    rightMax = [0 for i in range(n)]
   
    # for the rightmost digit, there
    # will be no greater right digit
    rightMax[n - 1] = -1
   
    # index of the greatest right digit till the
    # current index from the right direction
    right = n - 1
   
    # traverse the array from second right element
    # up to the left element
    i = n - 2
    while i >= 0:
          
        # if 'num[i]' is less than the greatest digit
        # encountered so far
        if (num[i] < num[right]):
            rightMax[i] = right
   
        # else
        else:
            # there is no greater right digit
            # for 'num[i]'
            rightMax[i] = -1
   
            # update 'right' index
            right = i
        i -= 1
          
    # traverse the 'rightMax[]' array from left to right
    for i in range(n):
          
        # if for the current digit, greater right digit exists
        # then swap it with its greater right digit and break
        if (rightMax[i] != -1):
              
            # performing the required swap operation
            t = num[i]
              
            num[i] = num[rightMax[i]]
            num[rightMax[i]] = t
            break
      
    # required largest number
    return num
   
# Driver program to test above
num = "8725634"
li = [i for i in num]
print "Largest number: "
li = largestNumber(li)
for i in li:
    print i,
print
  
#This code is contributed by Sachin Bisht


C#
// C# implementation to form the largest number
// by applying utmost one swap operation
  
using System;
using System.Text;
public class GFG
{
    // function to form the largest number by
    // applying utmost one swap operation
    static String largestNumber(String num)
    {
        int n = num.Length;
        int right;
        int[] rightMax = new int[n];
  
        // for the rightmost digit, there
        // will be no greater right digit
        rightMax[n - 1] = -1;
  
        // index of the greatest right digit
        // till the current index from the
        // right direction
        right = n - 1;
  
        // traverse the array from second right
        // element up to the left element
        for (int i = n - 1; i >= 0 ; i--)
        {
            // if 'num.charAt(i)' is less than the
            // greatest digit encountered so far
            if (num[i] < num[right])
                rightMax[i] = right;
  
            else
            {
                // there is no greater right digit
                // for 'num.charAt(i)'
                rightMax[i] = -1;
  
                // update 'right' index
                right = i;
            }
        }
  
        // traverse the 'rightMax[]' array from
        // left to right
        for (int i = 0; i < n; i++)
        {
  
            // if for the current digit, greater
            // right digit exists then swap it
            // with its greater right digit and break
            if (rightMax[i] != -1)
            {
                // performing the required swap operation
                num = swap(num,i,rightMax[i]);
                break;
            }
        }
  
        // required largest number
        return num;
    }
  
    // Utility method to swap two characters
    // in a String
    static String swap(String num, int i, int j)
    {
        StringBuilder sb= new StringBuilder(num);
        sb[i]=num[j];
        sb[j]=num[i];
        return sb.ToString();
  
    }
  
    //Driver Function to test above Function
    public static void Main()
    {
        String num = "8725634";
        Console.WriteLine("Largest Number : " +largestNumber(num));
    }
  
}
//This code is contributed by mits


PHP
= 0; $i--) 
    { 
  
        // if 'num[i]' is less than the
        // greatest digit encountered so far 
        if ($num[$i] < $num[$right]) 
            $rightMax[$i] = $right; 
  
        // else 
        else 
        { 
            // there is no greater right
            // digit for 'num[i]' 
            $rightMax[$i] = -1; 
  
            // update 'right' index 
            $right = $i; 
        } 
    } 
  
    // traverse the 'rightMax[]' 
    // array from left to right 
    for ($i = 0; $i < $n; $i++)
    { 
  
        // if for the current digit, greater 
        // right digit exists then swap it 
        // with its greater right digit and break 
        if ($rightMax[$i] != -1)
        { 
  
            // performing the required swap operation 
            list($num[$i], 
                 $num[$rightMax[$i]]) = array($num[$rightMax[$i]],
                                              $num[$i]);
          
            break; 
        } 
    } 
  
    // required largest number 
    return $num; 
} 
  
// Driver Code
$num = "8725634"; 
echo "Largest number: ",
     largestNumber($num); 
  
// This code is contributed by jit_t
?>


输出:

Largest number: 8765234

时间复杂度: O(n),其中n是位数。
辅助空间: O(n),其中n是数字的总数。