2384. Largest Palindromic Number

题目 2384. Largest Palindromic Number

image-ea9aea83

思路分析

image-0ac5b4c3

代码实现

import java.util.HashMap;

class Solution {
    public String largestPalindromic(String num) {
        HashMap<Character, Integer> map = new HashMap<>();
        char[] chars = num.toCharArray();

        for (char c : chars) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }

        StringBuilder left = new StringBuilder();
        String mid = "";

        for (char c = '9'; c >= '0'; c--) {
            if (!map.containsKey(c)) continue;

            int count = map.get(c);

            // --- 处理成对的数 (放在两边) ---
            // 只有当数字不是 '0',或者左边已经有非0数字时,才能放 '0'
            if (c != '0' || left.length() > 0) {
                // 把能凑成对的都放进左半边
                while (count >= 2) {
                    left.append(c);
                    count -= 2;
                }
            } else {
                // 如果是 '0' 且是前导零 (left为空),不能放入 left,但可能留作中间数
                // 这里不做操作,count 保持不变,留给下面判断 mid
            }

            // --- 处理剩下的单个值 (放在中间) ---
            // 因为我们是从 9 到 0 遍历的,第一个遇到的剩余单数一定是最大的
            // 只有当 mid 还没被填过时,才填入
            if (count > 0 && mid.equals("")) {
                mid = String.valueOf(c);
            }
        }

        // 3. 边界特判
        // 如果左边没东西,中间也没东西 (比如输入是空的,虽不仅限于此),或者是 "0" 的情况
        if (left.length() == 0 && mid.equals("")) {
            return "0"; // 至少要返回一个 0
        }

        // 4. 拼接:左 + 中 + 右(左的反转)
        return left.toString() + mid + left.reverse().toString();
    }
}

数据仅在0~9 无需hash 直接数组做bitmap计数即可

 class Solution {
    public String largestPalindromic(String num) {
        int[] counts = new int[10];
        for(char c:num.toCharArray()){
            counts[c-'0']++;
        }

        StringBuilder leftHalf = new StringBuilder();

        for(int i=9;i>=0;i--){
            if(i==0 && leftHalf.length()==0){
                continue;
            }
            while(counts[i]>1){
                leftHalf.append(i);
                counts[i]-=2;
            }
        }

        String mid = "";
        for(int i=9;i>=0;i--){
            if(counts[i]>0){
                mid=String.valueOf(i);
                break;
            }
        }

        if (leftHalf.length() == 0 && mid.equals("")) {
            return "0";
        }

        return leftHalf.toString() + mid + leftHalf.reverse().toString();
    }
}

同类题型

视频讲解