使用最多两次交换形成最大回文数
给定一个包含n位数的非负回文数num 。问题是对数字num最多应用两次交换操作,以便结果是最大可能的回文数。
例子:
Input : 4697557964
Output : 9647557469
In, 4697557964 the highlighted digits were
swapped to get the largest palindromic number
9647557469.
Input : 54345
Output : 54345
No swapping of digits required.
方法:如果 n < 3,则num本身就是最大可能的回文数。否则计算mid = (n / 2) – 1。然后创建一个大小为(mid + 1)的数组rightMax[] 。 rightMax[i]包含位于num[i]右侧且大于num[i]且 0 <= i <= mid 的最大数字的索引。如果不存在这样的数字,则rightMax[i] = -1。现在,从 i = 0 到 m 遍历rightMax[]数组,找到第一个具有 rightMax[i] != -1 的元素。执行swap(num[i], num[rightMax[i]])和swap(num[n – i – 1], num[n – rightMax[i] – 1])操作并中断。
C++
// C++ implementation to form the largest palindromic
// number using atmost two swaps
#include
using namespace std;
// function to form the largest palindromic
// number using atmost two swaps
void largestPalin(char num[], int n)
{
// if length of number is less than '3'
// then no higher palindromic number
// can be formed
if (n <= 3)
return;
// find the index of last digit
// in the 1st half of 'num'
int mid = n / 2 - 1;
int rightMax[mid + 1], right;
// as only the first half of 'num[]' is
// being considered, therefore
// for the rightmost digit in the first half
// of 'num[]', there will be no greater right digit
rightMax[mid] = -1;
// index of the greatest right digit till the
// current index from the right direction
right = mid;
// traverse the array from second right element
// in the first half of 'num[]' up to the
// left element
for (int i = mid - 1; i >= 0; i--) {
// if 'num[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[i]'
rightMax[i] = -1;
// update 'right' index
right = i;
}
}
// traverse the 'rightMax[]' array from left to right
for (int i = 0; i <= mid; i++) {
// if for the current digit, greater right digit exists
// then swap it with its greater right digit and also
// perform the required swap operation in the right halft
// of 'num[]' to maintain palindromic property, then break
if (rightMax[i] != -1) {
// performing the required swap operations
swap(num[i], num[rightMax[i]]);
swap(num[n - i - 1], num[n - rightMax[i] - 1]);
break;
}
}
}
// Driver program to test above
int main()
{
char num[] = "4697557964";
int n = strlen(num);
largestPalin(num, n);
// required largest palindromic number
cout << "Largest Palindrome: "
<< num;
return 0;
}
Java
// Java implementation to form the largest palindromic
// number using atmost two swaps
class GFG
{
// function to form the largest palindromic
// number using atmost two swaps
static void largestPalin(char num[], int n)
{
// if length of number is less than '3'
// then no higher palindromic number
// can be formed
if (n <= 3)
return;
// find the index of last digit
// in the 1st half of 'num'
int mid = n / 2 - 1;
int []rightMax = new int[mid + 1];int right;
// as only the first half of 'num[]' is
// being considered, therefore
// for the rightmost digit in the first half
// of 'num[]', there will be no greater right digit
rightMax[mid] = -1;
// index of the greatest right digit till the
// current index from the right direction
right = mid;
// traverse the array from second right element
// in the first half of 'num[]' up to the
// left element
for (int i = mid - 1; i >= 0; i--)
{
// if 'num[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[i]'
rightMax[i] = -1;
// update 'right' index
right = i;
}
}
// traverse the 'rightMax[]' array from left to right
for (int i = 0; i <= mid; i++)
{
// if for the current digit, greater right digit exists
// then swap it with its greater right digit and also
// perform the required swap operation in the right halft
// of 'num[]' to maintain palindromic property, then break
if (rightMax[i] != -1)
{
// performing the required swap operations
swap(num,i, rightMax[i]);
swap(num,n - i - 1, n - rightMax[i] - 1);
break;
}
}
}
static char[] swap(char []arr, int i, int j)
{
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
// Driver code
public static void main(String[] args)
{
char num[] = "4697557964".toCharArray();
int n = num.length;
largestPalin(num, n);
// required largest palindromic number
System.out.println("Largest Palindrome: "
+ String.valueOf(num));
}
}
// This code has been contributed by 29AjayKumar
Python 3
# Python implementation to form the largest
# palindromic number using atmost two swaps
# function to form the largest palindromic
# number using atmost two swaps
def largestPalin(num, n):
# if length of number is less than '3'
# then no higher palindromic number
# can be formed
if n <= 3:
return
# find the index of last digit
# in the 1st half of 'num'
mid = n // 2 + 1
rightMax = [0] * (mid + 1)
# as only the first half of 'num[]' is
# being considered, therefore
# for the rightmost digit in the first half
# of 'num[]', there will be no greater right digit
rightMax[mid] = -1
# index of the greatest right digit till the
# current index from the right direction
right = mid
# traverse the array from second right element
# in the first half of 'num[]' up to the
# left element
for i in range(mid-1, -1, -1):
# if 'num[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[i]'
rightMax[i] = -1
# update 'right' index
right = i
# traverse the 'rightMax[]' array from left to right
for i in range(mid + 1):
# if for the current digit, greater right digit exists
# then swap it with its greater right digit and also
# perform the required swap operation in the right halft
# of 'num[]' to maintain palindromic property, then break
if rightMax[i] != -1:
# performing the required swap operations
num[i], num[rightMax[i]] = num[rightMax[i]], num[i]
num[n-i-1], num[n - rightMax[i] - 1] = num[n - rightMax[i] - 1], num[n - i - 1]
break
# Driver Code
if __name__ == "__main__":
num = "4697557964"
n = len(num)
# Required as string object do not
# support item assignment
num = list(num)
largestPalin(num, n)
# making string again from list
num = ''.join(num)
print("Largest Palindrome: ",num)
# This code is contributed by
# sanjeev2552
C#
// C# implementation to form the largest
// palindromic number using atmost two swaps
using System;
class GFG
{
// function to form the largest palindromic
// number using atmost two swaps
static void largestPalin(char []num, int n)
{
// if length of number is less than '3'
// then no higher palindromic number
// can be formed
if (n <= 3)
return;
// find the index of last digit
// in the 1st half of 'num'
int mid = n / 2 - 1;
int []rightMax = new int[mid + 1]; int right;
// as only the first half of 'num[]' is
// being considered, therefore
// for the rightmost digit in the first half
// of 'num[]', there will be no greater right digit
rightMax[mid] = -1;
// index of the greatest right digit till the
// current index from the right direction
right = mid;
// traverse the array from second right element
// in the first half of 'num[]' up to the
// left element
for (int i = mid - 1; i >= 0; i--)
{
// if 'num[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[i]'
rightMax[i] = -1;
// update 'right' index
right = i;
}
}
// traverse the 'rightMax[]' array
// from left to right
for (int i = 0; i <= mid; i++)
{
// if for the current digit, greater right
// digit exists then swap it with its greater
// right digit and also perform the required
// swap operation in the right half of 'num[]'
// to maintain palindromic property, then break
if (rightMax[i] != -1)
{
// performing the required swap operations
swap(num, i, rightMax[i]);
swap(num, n - i - 1, n - rightMax[i] - 1);
break;
}
}
}
static char[] swap(char []arr, int i, int j)
{
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
// Driver code
public static void Main(String[] args)
{
char []num = "4697557964".ToCharArray();
int n = num.Length;
largestPalin(num, n);
// required largest palindromic number
Console.WriteLine("Largest Palindrome: " +
String.Join("", num));
}
}
// This code contributed by Rajput-Ji
Javascript
输出:
Largest Palindrome: 9647557469
时间复杂度: O(n)。
辅助空间: O(n)。