按排列位数计算的最大回文数

给定N(非常大),任务是打印通过排列N的数字获得的最大回文数。如果无法生成回文数,则打印适当的消息。

null

例如:

Input : 313551Output : 531135Explanations : 531135 is the largest number which is a palindrome, 135531, 315513 and other numbers can also be formed but we need the highest of all of the palindromes. Input : 331Output : 313Input : 3444Output : Palindrome cannot be formed 

天真的方法: 这个 缺乏经验的 方法将是尝试所有 排列 可能的话,打印出最大的这种组合,这是一个回文。

有效方法: 一个有效的方法是使用 贪婪算法。 由于数字较大,请将数字存储在字符串中。将给定数字中每个数字出现的次数存储在地图上。 检查是否可以形成回文。 如果给定数字的数字可以重新排列形成回文,则应用贪婪方法获得该数字。检查每个数字(9到0)是否出现,并将每个可用数字放在前面和后面。 最初,前面的指针将位于索引0处,因为最大的数字将放在第一位,使数字变大。 每走一步,将前指针向前移动1个位置。如果该数字出现奇数次,则将 中位数为一位,前后数为偶数。 .不断重复这个过程 (地图[数字]/2) 一个位数的次数。在前面和后面放置偶数次的特定数字后,将前面的指针向前移动一步。放置完成,直到map[数字]为0。在贪婪地放置完数字之后,char数组将拥有最大的回文数。 在最坏的情况下,时间复杂度将是 O(10*(字符串长度/2)) ,以防数字在每个位置由相同的数字组成。 以下是上述理念的实施情况:

C++

// CPP program to print the largest palindromic
// number by permuting digits of a number
#include <bits/stdc++.h>
using namespace std;
// function to check if a number can be
// permuted to form a palindrome number
bool possibility(unordered_map< int , int > m,
int length, string s)
{
// counts the occurrence of number which is odd
int countodd = 0;
for ( int i = 0; i < length; i++) {
// if occurrence is odd
if (m[s[i] - '0' ] & 1)
countodd++;
// if number exceeds 1
if (countodd > 1)
return false ;
}
return true ;
}
// function to print the largest palindromic number
// by permuting digits of a number
void largestPalindrome(string s)
{
// string length
int l = s.length();
// map that marks the occurrence of a number
unordered_map< int , int > m;
for ( int i = 0; i < l; i++)
m[s[i] - '0' ]++;
// check the possibility of a palindromic number
if (possibility(m, l, s) == false ) {
cout << "Palindrome cannot be formed" ;
return ;
}
// string array that stores the largest
// permuted palindromic number
char largest[l];
// pointer of front
int front = 0;
// greedily start from 9 to 0 and place the
// greater number in front and odd in the
// middle
for ( int i = 9; i >= 0; i--) {
// if the occurrence of number is odd
if (m[i] & 1) {
// place one odd occurring number
// in the middle
largest[l / 2] = char (i + 48);
// decrease the count
m[i]--;
// place the rest of numbers greedily
while (m[i] > 0) {
largest[front] = char (i + 48);
largest[l - front - 1] = char (i + 48);
m[i] -= 2;
front++;
}
}
else {
// if all numbers occur even times,
// then place greedily
while (m[i] > 0) {
// place greedily at front
largest[front] = char (i + 48);
largest[l - front - 1] = char (i + 48);
// 2 numbers are placed, so decrease the count
m[i] -= 2;
// increase placing position
front++;
}
}
}
// print the largest string thus formed
for ( int i = 0; i < l; i++)
cout << largest[i];
}
// Driver Code
int main()
{
string s = "313551" ;
largestPalindrome(s);
return 0;
}


JAVA

// JAVA program to print the
// largest palindromic number
// by permuting digits of a number
import java.util.*;
class GFG{
// Function to check if a number can be
// permuted to form a palindrome number
static boolean possibility(HashMap<Integer,
Integer> m,
int length, String s)
{
// counts the occurrence of number
// which is odd
int countodd = 0 ;
for ( int i = 0 ; i < length; i++)
{
// if occurrence is odd
if (m.get(s.charAt(i) - '0' ) % 2 == 1 )
countodd++;
// if number exceeds 1
if (countodd > 1 )
return false ;
}
return true ;
}
// function to print the largest
// palindromic number by permuting
// digits of a number
static void largestPalindrome(String s)
{
// String length
int l = s.length();
// map that marks the occurrence
// of a number
HashMap<Integer,
Integer> m = new HashMap<>();
for ( int i = 0 ; i < l; i++)
if (m.containsKey(s.charAt(i) - '0' ))
m.put(s.charAt(i) - '0' ,
m.get(s.charAt(i) - '0' ) + 1 );
else
m.put(s.charAt(i) - '0' , 1 );
// check the possibility of a
// palindromic number
if (possibility(m, l, s) == false )
{
System.out.print( "Palindrome cannot be formed" );
return ;
}
// String array that stores
// the largest permuted
// palindromic number
char []largest = new char [l];
// pointer of front
int front = 0 ;
// greedily start from 9 to 0
// and place the greater number
// in front and odd in the middle
for ( int i = 9 ; i >= 0 ; i--)
{
// if the occurrence of
// number is odd
if (m.containsKey(i) &&
m.get(i)% 2 == 1 )
{
// place one odd occurring
// number in the middle
largest[l / 2 ] = ( char )(i + 48 );
// decrease the count
m.put(i, m.get(i)- 1 );
// place the rest of
// numbers greedily
while (m.get(i) > 0 )
{
largest[front] = ( char )(i + 48 );
largest[l - front - 1 ] =
( char )(i + 48 );
m.put(i, m.get(i) - 2 );
front++;
}
}
else
{
// if all numbers occur even
// times, then place greedily
while (m.containsKey(i) &&
m.get(i) > 0 )
{
// place greedily at front
largest[front] = ( char )(i + 48 );
largest[l - front - 1 ] =
( char )(i + 48 );
// 2 numbers are placed,
// so decrease the count
m.put(i, m.get(i) - 2 );
// increase placing position
front++;
}
}
}
// print the largest String
// thus formed
for ( int i = 0 ; i < l; i++)
System.out.print(largest[i]);
}
// Driver Code
public static void main(String[] args)
{
String s = "313551" ;
largestPalindrome(s);
}
}
// This code is contributed by Rajput-Ji


Python3

# Python3 program to print the largest palindromic
# number by permuting digits of a number
from collections import defaultdict
# Function to check if a number can be
# permuted to form a palindrome number
def possibility(m, length, s):
# counts the occurrence of
# number which is odd
countodd = 0
for i in range ( 0 , length):
# if occurrence is odd
if m[ int (s[i])] & 1 :
countodd + = 1
# if number exceeds 1
if countodd > 1 :
return False
return True
# Function to print the largest palindromic
# number by permuting digits of a number
def largestPalindrome(s):
# string length
l = len (s)
# map that marks the occurrence of a number
m = defaultdict( lambda : 0 )
for i in range ( 0 , l):
m[ int (s[i])] + = 1
# check the possibility of a
# palindromic number
if possibility(m, l, s) = = False :
print ( "Palindrome cannot be formed" )
return
# string array that stores the largest
# permuted palindromic number
largest = [ None ] * l
# pointer of front
front = 0
# greedily start from 9 to 0 and place the
# greater number in front and odd in the middle
for i in range ( 9 , - 1 , - 1 ):
# if the occurrence of number is odd
if m[i] & 1 :
# place one odd occurring number
# in the middle
largest[l / / 2 ] = chr (i + 48 )
# decrease the count
m[i] - = 1
# place the rest of numbers greedily
while m[i] > 0 :
largest[front] = chr (i + 48 )
largest[l - front - 1 ] = chr (i + 48 )
m[i] - = 2
front + = 1
else :
# if all numbers occur even times,
# then place greedily
while m[i] > 0 :
# place greedily at front
largest[front] = chr (i + 48 )
largest[l - front - 1 ] = chr (i + 48 )
# 2 numbers are placed,
# so decrease the count
m[i] - = 2
# increase placing position
front + = 1
# print the largest string thus formed
for i in range ( 0 , l):
print (largest[i], end = "")
# Driver Code
if __name__ = = "__main__" :
s = "313551"
largestPalindrome(s)
# This code is contributed by Rituraj Jain


C#

// C# program to print the largest
// palindromic number by permuting
// digits of a number
using System;
using System.Collections.Generic;
class GFG{
// Function to check if a number can be
// permuted to form a palindrome number
static bool possibility(Dictionary< int , int > m,
int length, string s)
{
// Counts the occurrence of number
// which is odd
int countodd = 0;
for ( int i = 0; i < length; i++)
{
// If occurrence is odd
if ((m[s[i] - '0' ] & 1) != 0)
countodd++;
// If number exceeds 1
if (countodd > 1)
return false ;
}
return true ;
}
// Function to print the largest palindromic
// number by permuting digits of a number
static void largestPalindrome( string s)
{
// string length
int l = s.Length;
// Map that marks the occurrence of a number
Dictionary< int ,
int > m = new Dictionary< int ,
int >();
for ( int i = 0; i < 10; i++)
m[i] = 0;
for ( int i = 0; i < l; i++)
m[s[i] - '0' ]++;
// Check the possibility of a
// palindromic number
if (possibility(m, l, s) == false )
{
Console.Write( "Palindrome cannot be formed" );
return ;
}
// string array that stores the largest
// permuted palindromic number
char []largest = new char [l];
// Pointer of front
int front = 0;
// Greedily start from 9 to 0 and place the
// greater number in front and odd in the
// middle
for ( int i = 9; i >= 0; i--)
{
// If the occurrence of number is odd
if ((m[i] & 1) != 0)
{
// Place one odd occurring number
// in the middle
largest[l / 2] = ( char )(i + '0' );
// Decrease the count
m[i]--;
// Place the rest of numbers greedily
while (m[i] > 0)
{
largest[front] = ( char )(i + '0' );
largest[l - front - 1] = ( char )(i + '0' );
m[i] -= 2;
front++;
}
}
else
{
// If all numbers occur even times,
// then place greedily
while (m[i] > 0)
{
// Place greedily at front
largest[front] = ( char )(i + '0' );
largest[l - front - 1] = ( char )(i + '0' );
// 2 numbers are placed, so
// decrease the count
m[i] -= 2;
// Increase placing position
front++;
}
}
}
// Print the largest string thus formed
for ( int i = 0; i < l; i++)
{
Console.Write(largest[i]);
}
}
// Driver Code
public static void Main( string [] args)
{
string s = "313551" ;
largestPalindrome(s);
}
}
// This code is contributed by rutvik_56


Javascript

<script>
// Javascript program to print the largest palindromic
// number by permuting digits of a number
// function to check if a number can be
// permuted to form a palindrome number
function possibility(m,length, s)
{
// counts the occurrence of number which is odd
var countodd = 0;
for ( var i = 0; i < length; i++) {
// if occurrence is odd
if (m.get(s.charCodeAt(i) - 48) & 1)
countodd++;
// if number exceeds 1
if (countodd > 1)
return false ;
}
return true ;
}
// function to print the largest palindromic number
// by permuting digits of a number
function largestPalindrome(s)
{
// string length
var l = s.length;
// map that marks the occurrence of a number
var m = new Map();
for ( var i = 0; i < l; i++){
if (m.has(s.charCodeAt(i) - 48))
m.set(s.charCodeAt(i) - 48, m.get(s.charCodeAt(i) - 48)+1);
else
m.set(s.charCodeAt(i) - 48, 1);
}
// check the possibility of a palindromic number
if (possibility(m, l, s) == false ) {
document.write( "Palindrome cannot be formed" );
return ;
}
// string array that stores the largest
// permuted palindromic number
var largest = new Array(l);
// pointer of front
var front = 0;
// greedily start from 9 to 0 and place the
// greater number in front and odd in the
// middle
for ( var i = 9; i >= 0; i--) {
// if the occurrence of number is odd
if (m.has(i) & 1) {
// place one odd occurring number
// in the middle
largest[Math.floor(l / 2)] = String.fromCharCode(i + 48);
// decrease the count
m.set(i, m.get(i)-1);
// place the rest of numbers greedily
while (m.get(i) > 0) {
largest[front] = String.fromCharCode(i + 48);
largest[l - front - 1] = String.fromCharCode(i + 48);
m.set(i, m.get(i)-2);
front++;
}
}
else {
// if all numbers occur even times,
// then place greedily
while (m.get(i) > 0){
// place greedily at front
largest[front] = String.fromCharCode(i + 48);
largest[l - front - 1] = String.fromCharCode(i + 48);
// 2 numbers are placed, so decrease the count
m.set(i, m.get(i)-2);
// increase placing position
front++;
}
}
}
// print the largest string thus formed
for ( var i = 0; i < l; i++)
document.write(largest[i]);
}
// driver code
var s = "313551" ;
largestPalindrome(s);
// This code contributed by shubhamsingh10
</script>


输出:

531135

时间复杂性: O(n),其中n是字符串的长度。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享