[杨小白]_leetcode_第307场周赛-第二题2384. 最大回文数字

194 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

第307场周赛-力扣

第307场周赛-力扣

306的第二题还算不难,基本把题目读懂了,就可以做出来了,注意会超int,竞赛时间内会把这个输入案例隐藏。第三题第四题就是干瞪眼了,难顶啊!!!

现在介绍这个题。

2384. 最大回文数字

给你一个仅由数字(0 - 9)组成的字符串 num 。

请你找出能够使用 num 中数字形成的 最大回文 整数,并以字符串形式返回。该整数不含 前导零 。

注意:

  • 你 无需 使用 num 中的所有数字,但你必须使用 至少 一个数字。
  • 数字可以重新排序。

示例 1

输入:num = "444947137"

输出:"7449447"

解释:

从 "444947137" 中选用数字 "4449477",可以形成回文整数 "7449447" 。 可以证明 "7449447" 是能够形成的最大回文整数。

示例 2

输入: num = "00009"

输出: "9"

解释: 可以证明 "9" 能够形成的最大回文整数。 注意返回的整数不应含前导零。

提示:

  • 1 <= num.length <= 105
  • num 由数字(0 - 9)组成

2.解法

class Solution {
    public String largestPalindromic(String num) {
        char[] chars = num.toCharArray();
        int[] nums = new int[10];
        for (int i = 0; i < chars.length; i++) {
            int j = chars[i] - '0';
            nums[j]++;
        }
        StringBuffer qian = new StringBuffer();
        StringBuffer hou = new StringBuffer();
        StringBuffer ling = new StringBuffer();
        for (int i = 9; i > 0; i--) {
            if (nums[i] > 1) {
                for (int j = 0; j < nums[i] / 2; j++) {
                    qian.append(i);
                    hou.insert(0,i);
                }
            }
        }
        if (qian.length() == 0) {
            for (int i = 9; i >= 0; i--) {
                if (nums[i] != 0) {
                    return new String(String.valueOf(i));
                }
            }
        }
        for (int i = 0; i < nums[0] / 2; i++) {
            ling.append(0);
            ling.append(0);
        }
        int temp = 0;
        if(ling.length() % 2 == 0 && ling.length() + qian.length() + hou.length() != num.length()) {
            for(int k = 9; k >= 0; k--) {
                if(nums[k] % 2==1) {
                    ling.insert(ling.length() / 2,k);
                    break;
                }
            }
        }
        return qian.toString() +ling.toString()+ hou.toString();
    }
}

解析

这个题啊,做的真是又臭又长。思路如下

1.用nums数组,分别统计0-9的个数

2.新建三个StringBuffer,一个记录前一半,一个记录对称的后一半(这两个只包括1到9),还有一个记录中间的部分(只包括0,或者包含一个数字)。

3.遍历9到1的数字nums[i],如果nums[i]大于等于2,就给前面的StringBuffer分一半,给后面的分一半StringBuffer。这样能保证返回的是最大的数。

4.如果此时前面两个字符串里面都没有字符,那说明1-9中,每个字符中只有一个。所以最终返回的值一定是0-9之间的一个,所以从9到0遍历,如果存在这个数,就直接返回。

5.剩下就是在中间添加0,添加2的整数倍,然后遍历9-1如果存在有单个的字符,就添加在中间。如果没有那就看0有没有剩余的单个的,添加在中间即可。

第一题链接如下

[杨小白]_leetcode_第307场周赛-第一题2383. 赢得比赛需要的最少训练时长

3.结束

这个题作为第二题,算是比较简单的了,这个题平常遇到还算要能做出来的,刷题刷题,每天一道,三年1000道!!!!