2025-03-29:找出最大的 N 位 K 回文数。用go语言,给定两个正整数 n 和 k。 一个正整数 x 被称为 k 回文

举报
福大大架构师每日一题 发表于 2025/03/29 07:10:52 2025/03/29
【摘要】 2025-03-29:找出最大的 N 位 K 回文数。用go语言,给定两个正整数 n 和 k。一个正整数 x 被称为 k 回文数,当且仅当它满足以下所有条件:1.x 是一个回文数。2.x 可以被 k 整除。请以字符串的形式返回最大的 n 位 k 回文数。需要注意的是,该数不能有前导零。1 <= n <= 100000。1 <= k <= 9。输入: n = 3, k = 5。输出: “595...

2025-03-29:找出最大的 N 位 K 回文数。用go语言,给定两个正整数 n 和 k。

一个正整数 x 被称为 k 回文数,当且仅当它满足以下所有条件:

1.x 是一个回文数。

2.x 可以被 k 整除。

请以字符串的形式返回最大的 n 位 k 回文数。需要注意的是,该数不能有前导零。

1 <= n <= 100000。

1 <= k <= 9。

输入: n = 3, k = 5。

输出: “595”。

解释:

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

题目来自leetcode3260。

大体步骤如下:

1.首先定义一个长度为 N 的数组 pow10,用于存储 10 的幂,以便后续计算。

2.接着创建一个长度为 N 的答案数组 ans,初始化为 0。

3.计算回文数的中间位置,定义一个二维数组 vis 用于记录访问状态。

4.定义深度优先搜索函数 dfs,依次尝试填充回文数的各位数字。

5.在 dfs 函数中,采用贪心算法,从大到小枚举可填充的数字。

6.递归地尝试填充各位数字,直到得到最大的回文数。

7.执行 main 函数,给定输入参数 n=3 和 k=5,调用largestPalindrome(n, k)得到结果并打印输出。

总的时间复杂度为 O(N * 10),其中 N 为数字长度,10 为数字排列的可能性。

总的额外空间复杂度为 O(N * K),其中 N 为数字长度,K 为除数范围。

Go完整代码如下:

package main

import (
	"fmt"
)

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)
}

func main() {
	n := 3
	k := 5
	result := largestPalindrome(n, k)
	fmt.Println(result)
}

在这里插入图片描述

Python3完整代码如下:

# -*-coding:utf-8-*-

def largest_palindrome(n, k):
    pow10 = [1] * n
    for i in range(1, n):
        pow10[i] = (pow10[i - 1] * 10) % k

    ans = ['0'] * n
    m = (n + 1) // 2
    vis = [[False] * k for _ in range(m + 1)]

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

    dfs(0, 0)
    return ''.join(ans)

# 示例用法
n = 3
k = 5
result = largest_palindrome(n, k)
print(result)

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。