列表

详情


100409. 找出最大的 N 位 K 回文数

给你两个 正整数 nk

如果整数 x 满足以下全部条件,则该整数是一个 k 回文数

以字符串形式返回 最大的  nk 回文数

注意,该整数 含前导零。

 

示例 1:

输入: n = 3, k = 5

输出: "595"

解释:

595 是最大的 3 位 k 回文数。

示例 2:

输入: n = 1, k = 4

输出: "8"

解释:

1 位 k 回文数只有 4 和 8。

示例 3:

输入: n = 5, k = 6

输出: "89898"

 

提示:

相似题目

回文数

寻找最近的回文数

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: string largestPalindrome(int n, int k) { } };

golang 解法, 执行用时: 161 ms, 内存消耗: 24.5 MB, 提交时间: 2024-10-20 10:13:28

func largestPalindrome(n, k int) string {
	pow10 := make([]int, n)
	pow10[0] = 1
	for i := 1; i < n; i++ {
		pow10[i] = pow10[i-1] * 10 % k
	}

	ans := make([]byte, n)
	m := (n + 1) / 2
	vis := make([][]bool, m+1)
	for i := range vis {
		vis[i] = make([]bool, k)
	}
	var dfs func(int, int) bool
	dfs = func(i, j int) bool {
		if i == m {
			return j == 0
		}
		vis[i][j] = true
		for d := 9; d >= 0; d-- { // 贪心:从大到小枚举
			var j2 int
			if n%2 > 0 && i == m-1 { // 正中间
				j2 = (j + d*pow10[i]) % k
			} else {
				j2 = (j + d*(pow10[i]+pow10[n-1-i])) % k
			}
			if !vis[i+1][j2] && dfs(i+1, j2) {
				ans[i] = '0' + byte(d)
				ans[n-1-i] = ans[i]
				return true
			}
		}
		return false
	}
	dfs(0, 0)
	return string(ans)
}

cpp 解法, 执行用时: 412 ms, 内存消耗: 92.6 MB, 提交时间: 2024-10-20 10:13:13

class Solution {
public:
    string largestPalindrome(int n, int k) {
        vector<int> pow10(n);
        pow10[0] = 1;
        for (int i = 1; i < n; i++) {
            pow10[i] = pow10[i - 1] * 10 % k;
        }

        string ans(n, 0);
        int m = (n + 1) / 2;
        vector<vector<int>> vis(m + 1, vector<int>(k));
        auto dfs = [&](auto&& dfs, int i, int j) -> bool {
            if (i == m) {
                return j == 0;
            }
            vis[i][j] = true;
            for (int d = 9; d >= 0; d--) { // 贪心:从大到小枚举
                int j2;
                if (n % 2 && i == m - 1) { // 正中间
                    j2 = (j + d * pow10[i]) % k;
                } else {
                    j2 = (j + d * (pow10[i] + pow10[n - 1 - i])) % k;
                }
                if (!vis[i + 1][j2] && dfs(dfs, i + 1, j2)) {
                    ans[i] = ans[n - 1 - i] = '0' + d;
                    return true;
                }
            }
            return false;
        };
        dfs(dfs, 0, 0);
        return ans;
    }
};

java 解法, 执行用时: 148 ms, 内存消耗: 52.5 MB, 提交时间: 2024-10-20 10:13:00

class Solution {
    public String largestPalindrome(int n, int k) {
        int[] pow10 = new int[n];
        pow10[0] = 1;
        for (int i = 1; i < n; i++) {
            pow10[i] = pow10[i - 1] * 10 % k;
        }

        char[] ans = new char[n];
        int m = (n + 1) / 2;
        boolean[][] vis = new boolean[m + 1][k];
        dfs(0, 0, n, k, m, pow10, ans, vis);
        return new String(ans);
    }

    private boolean dfs(int i, int j, int n, int k, int m, int[] pow10, char[] ans, boolean[][] vis) {
        if (i == m) {
            return j == 0;
        }
        vis[i][j] = true;
        for (int d = 9; d >= 0; d--) { // 贪心:从大到小枚举
            int j2;
            if (n % 2 > 0 && i == m - 1) { // 正中间
                j2 = (j + d * pow10[i]) % k;
            } else {
                j2 = (j + d * (pow10[i] + pow10[n - 1 - i])) % k;
            }
            if (!vis[i + 1][j2] && dfs(i + 1, j2, n, k, m, pow10, ans, vis)) {
                ans[i] = ans[n - 1 - i] = (char) ('0' + d);
                return true;
            }
        }
        return false;
    }
}

python3 解法, 执行用时: 3049 ms, 内存消耗: 51.3 MB, 提交时间: 2024-10-20 10:12:47

class Solution:
    def largestPalindrome(self, n: int, k: int) -> str:
        pow10 = [1] * n
        for i in range(1, n):
            pow10[i] = pow10[i - 1] * 10 % k

        ans = [''] * n
        m = (n + 1) // 2
        vis = [[False] * k for _ in range(m + 1)]
        def dfs(i: int, j: int) -> bool:
            if i == m:
                return j == 0
            vis[i][j] = True
            for d in range(9, -1, -1):  # 贪心:从大到小枚举
                if n % 2 and i == m - 1:  # 正中间
                    j2 = (j + d * pow10[i]) % k
                else:
                    j2 = (j + d * (pow10[i] + pow10[-1 - i])) % k
                if not vis[i + 1][j2] and dfs(i + 1, j2):
                    ans[i] = ans[-1 - i] = str(d)
                    return True
            return False
        dfs(0, 0)
        return ''.join(ans)

上一题