给定一个非负数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(其中n是num中的位数),并找到第一个具有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是数字的总数。