Kimi K2.6 思考 LeetCode 3260. 找出最大的 N 位 K 回文数 Go实现
以下是 LeetCode 3260 找出最大的 N 位 K 回文数 的 Go 实现,基于 k 的分类讨论规律解法,时间复杂度 O(n),空间复杂度 O(n)(返回结果字符串)。
```go
package main
import "strings"
func largestPalindrome(n int, k int) string {
switch k {
case 1, 3, 9:
// 全9即可被 1/3/9 整除
return strings.Repeat("9", n)
case 2:
// 末位需为偶数,取最大偶数8;首位也需为8(回文)
if n <= 2 {
return strings.Repeat("8", n)
}
return "8" + strings.Repeat("9", n-2) + "8"
case 4:
// 末两位需被4整除,88是最大满足条件的两位
if n <= 4 {
return strings.Repeat("8", n)
}
return "88" + strings.Repeat("9", n-4) + "88"
case 5:
// 末位需为0或5,取5(不能前导零)
if n <= 2 {
return strings.Repeat("5", n)
}
return "5" + strings.Repeat("9", n-2) + "5"
case 6:
// 需同时满足被2和被3整除
if n <= 2 {
return strings.Repeat("6", n)
}
if n%2 == 1 {
// 奇数位: 8...8...8,中间8保证数字和为3的倍数
l := n/2 - 1
return "8" + strings.Repeat("9", l) + "8" + strings.Repeat("9", l) + "8"
}
// 偶数位: 中间两位取77,使数字和为3的倍数
l := n/2 - 2
return "8" + strings.Repeat("9", l) + "77" + strings.Repeat("9", l) + "8"
case 7:
// k=7 的规律较复杂,按 n%12 分类讨论
if n <= 2 {
return strings.Repeat("7", n)
}
mod := n % 12
switch mod {
case 0, 6:
return strings.Repeat("9", n)
case 3:
res := make([]byte, n)
for i := range res {
res[i] = '9'
}
res[n/2] = '5'
return string(res)
case 9:
res := make([]byte, n)
for i := range res {
res[i] = '9'
}
res[n/2] = '6'
return string(res)
case 1, 2, 4, 5:
res := make([]byte, n)
for i := range res {
res[i] = '7'
}
for i, j := 0, n-1; i+1 < j; i, j = i+1, j-1 {
res[i] = '9'
res[j] = '9'
}
return string(res)
case 7, 8, 10, 11:
res := make([]byte, n)
for i := range res {
res[i] = '4'
}
for i, j := 0, n-1; i+1 < j; i, j = i+1, j-1 {
res[i] = '9'
res[j] = '9'
}
return string(res)
}
case 8:
// 末三位需被8整除,888是最大满足条件的三位
if n <= 6 {
return strings.Repeat("8", n)
}
return "888" + strings.Repeat("9", n-6) + "888"
}
return ""
}
```
核心思路说明
由于 `k ≤ 9`,可以对每个 k 值利用整除规则和回文约束分别找规律:
k 关键规则 构造方式
1, 3, 9 数字和是3/9的倍数 全 `9`
2 末位偶数 首尾 `8`,中间全 `9`
4 末两位被4整除 前两位和末两位 `88`,中间全 `9`
5 末位0或5 首尾 `5`,中间全 `9`
6 被2且被3整除 奇数:`8...8...8`;偶数:中间 `77`
7 无简单规则 按 `n % 12` 分类,共6种子情况
8 末三位被8整除 前三位和末三位 `888`,中间全 `9`
复杂度分析
- 时间复杂度: O(n) — 主要是 `strings.Repeat` 和 `make([]byte, n)` 的字符串构造
- 空间复杂度: O(n) — 返回结果字符串所需空间
这种方法比通用的 DP 解法(O(nk) 时间)更简洁高效,充分利用了 `k ≤ 9` 的题目约束。
