题目:
给你一个仅由数字(0 - 9)组成的字符串 num 。
请你找出能够使用 num 中数字形成的 最大回文 整数,并以字符串形式返回。该整数不含 前导零 。
注意:
- 你 无需 使用 num 中的所有数字,但你必须使用 至少 一个数字。
- 数字可以重新排序。
解答:
方法一:
class Solution:
def largestPalindromic(self, num: str) -> str:
dic={}
for c in num:
dic[c]=dic.get(c,0)+1
dic=sorted(dic.items(),key=lambda x:x[0],reverse=True)
#print(dic)
if len(dic)==1 and dic[0][0]=='0':
return "0"
res=[]
flag=False
for c,cnt in dic:
n = len(res) // 2
#第一次遇见奇数,设置奇数出现标记,将最中间的字符设为该字符
if cnt%2==1:
if not flag:
odd=[c]
flag=True
if c=='0' and n==0:
continue
else:
res=res[:n]+[c]*(cnt-1)+res[n:]
else:
if c=='0' and n==0:
continue
else:
res=res[:n]+[c]*cnt+res[n:]
#print(res,odd)
n=len(res)//2
if flag:
res=res[:n]+odd+res[n:]
return ''.join(res)
方法二:
class Solution:
def largestPalindromic(self, num: str) -> str:
#先构造左半部分,最后填充一个镜像字符串就好了
cnt=Counter(num)
if cnt['0']==len(num):
return "0"
#枚举9到1,然后单独考虑0
s=""
for d in digits[:0:-1]:
s+=d*(cnt[d]//2)
if s: #可以填0
s+='0'*(cnt['0']//2)
t=s[::-1]
#考虑正中间一个字符
for d in digits[::-1]:
if cnt[d]%2==1:
s+=d
break
return s+t