网易首页 > 网易号 > 正文 申请入驻

2026-05-07:给定范围内平衡整数的数目。用go语言,给定两个整数 low 和 high,统计在闭区间 [low, high] 内满足“平衡”条件...

0
分享至

2026-05-07:给定范围内平衡整数的数目。用go语言,给定两个整数 low 和 high,统计在闭区间 [low, high] 内满足“平衡”条件的整数个数。

对某个整数,先要求它至少是两位数。接着把它的每一位数字按位置从左到右编号,最左边是第 1 位。将所有在奇数位上的数字相加,得到奇数位数字和;再把所有在偶数位上的数字相加,得到偶数位数字和。如果这两个和相等,则该整数被称为“平衡整数”。

最终,你需要返回区间 [low, high] 中所有平衡整数的数量。

1 <= low <= high <= 1000000000000000。

输入: low = 1, high = 100。

输出: 9。

解释:

1 到 100 之间共有 9 个平衡数,分别是 11、22、33、44、55、66、77、88 和 99。

题目来自力扣3791。

平衡整数计数代码执行过程分步详解 一、代码整体执行步骤(分阶段) 阶段1:基础边界过滤

  1. 1. 函数接收lowhigh两个超大整数(int64类型);

  2. 2. 首先判断:如果high < 11,直接返回0(因为最小的平衡数是11,没有符合条件的数);

  3. 3. 把low修正为max(low, 11),排除1-10这些无效数字,缩小计算范围。

阶段2:数字格式化与预处理
  1. 1. 将修正后的lowhigh转换成字符串

  • • 目的:方便逐位处理每一位数字(数位DP的核心操作);

2. 计算high的字符串长度n(最大数字的位数):

  • • 示例中high=100,字符串是"100",长度n=3

3. 计算diffLHhigh的位数 -low的位数,用于后续限制低位数字的枚举范围;

4.初始化记忆化数组(memo)

  • • 二维数组:第一维是当前处理到第几位(0~n-1),第二维是奇偶位差值的存储位;

  • • 作用:缓存已经计算过的状态,避免重复递归,大幅提升效率。

阶段3:核心逻辑 —— 数位DFS递归(深度优先搜索)

定义递归函数dfs,这是数位DP的核心,参数含义:

  • i:当前正在处理第i位数字(从0开始,对应数字的最高位);

  • diff奇数位和 - 偶数位和的差值(最终diff=0就是平衡数);

  • limitLow:布尔值,当前位是否受low的下限约束;

  • limitHigh:布尔值,当前位是否受high的上限约束。

递归执行流程:

子步骤1:递归终止条件

i == n(所有位数处理完毕):

  • • 判断diff是否等于0:

    • • 等于0 → 是平衡数,返回1(计数+1);

    • • 不等于0 → 不是平衡数,返回0。

子步骤2:记忆化缓存读取

如果当前不受low和high的数字限制(可以自由枚举0-9):

  1. 1. 计算记忆数组的下标(将差值偏移为非负数,防止数组越界);

  2. 2. 如果该状态已经计算过 → 直接返回缓存的结果,不重复计算;

  3. 3. 如果没计算过 → defer延迟存储结果,计算完成后写入缓存。

子步骤3:确定当前位的枚举范围

根据limitLowlimitHigh,限制当前位能选的数字:

  • • 下限lo:受约束时=low对应位的数字,不受约束时=0;

  • • 上限hi:受约束时=high对应位的数字,不受约束时=9;

  • • 示例:处理100的百位时,hi只能是1,不能超过high的数字。

子步骤4:枚举当前位的所有合法数字

循环遍历从lohi的每一个数字d

  1. 1.更新差值diff

  • • 第i位是奇数位(i%2=0):diff = diff + d;

  • • 第i位是偶数位(i%2=1):diff = diff - d;

2.更新约束条件

  • • 下一位的limitLow= 当前约束 且 当前选的数字=下限;

  • • 下一位的limitHigh= 当前约束 且 当前选的数字=上限;

3. 递归调用下一位,累加所有合法结果。

子步骤5:返回累计结果

将当前位所有枚举情况的结果求和,返回给上一层递归。

阶段4:返回最终答案

启动递归dfs(0, 0, true, true)(从第0位开始,初始差值为0,同时受low和high约束),函数返回的就是[low, high]内平衡整数的总数量。

二、针对示例输入的执行验证

输入:low=1,high=100

  1. 1. 过滤:high=100≥11,low修正为11;

  2. 2. 格式化:low="11"(2位),high="100"(3位),n=3;

  3. 3. 递归枚举所有11~100的两位数、三位数:

  • • 两位数(11~99):奇数位=十位,偶数位=个位,十位=个位 → 11、22…99,共9个;

  • • 三位数(100):奇数位(百位+个位)=1+0=1,偶数位(十位)=0,1≠0 → 不合法;

4. 最终结果=9,与题目输出一致。

三、时间复杂度 & 额外空间复杂度 1. 时间复杂度

O(位数 × 最大差值 × 10)

  • • 核心变量:

  1. 1. 数字最大位数n:10¹⁵对应15位

  2. 2. 奇偶位最大差值:每位最大9,总差值≤15×9=135;

  3. 3. 每位枚举数字:0~9共10种选择;

• 总计算量:15 × 135 × 10 =20250(常数级极小计算量);

• 本质:O(1) 常数时间复杂度(因为位数固定最大15,无变量级增长)。

2. 额外空间复杂度

O(位数 × 最大差值)

  • • 核心占用:记忆化数组memo

  • • 大小:15(位数) × 135(最大差值)=2025个int64元素;

  • • 递归栈空间:最大深度=数字位数=15,可忽略;

  • • 本质:O(1) 常数空间复杂度

总结
  1. 1. 代码核心是数位DP+记忆化递归,专门解决超大范围数字的数位统计问题;

  2. 2. 执行流程:边界过滤→数字格式化→记忆化DFS逐位枚举→统计合法平衡数;

  3. 3. 时间复杂度:O(1)(常数级)

  4. 4. 额外空间复杂度:O(1)(常数级)

Go完整代码如下:

package main

import (
"fmt"
"strconv"
)

func countBalanced(low, high int64)int64 {
// 最小的满足要求的数是 11
if high < 11 {
return0
}

low = max(low, 11)
lowS := strconv.FormatInt(low, 10)
highS := strconv.FormatInt(high, 10)
n := len(highS)
diffLH := n - len(lowS)
memo := make([][]int64, n)
for i := range memo {
// diff 至少 floor(n/2) * 9,至多 ceil(n/2) * 9,值域大小 n * 9
memo[i] = make([]int64, n*9+1)
}

var dfs func(int, int, bool, bool)int64
dfs = func(i, diff int, limitLow, limitHigh bool) (res int64) {
if i == n {
if diff != 0 { // 不合法
return0
}
return1
}
if !limitLow && !limitHigh {
p := &memo[i][diff+n/2*9] // 保证下标非负
if *p > 0 {
return *p - 1
}
deferfunc() { *p = res + 1 }() // 记忆化的时候加一,这样 memo 可以初始化成 0
}

lo := 0
if limitLow && i >= diffLH {
lo = int(lowS[i-diffLH] - '0')
}
hi := 9
if limitHigh {
hi = int(highS[i] - '0')
}

for d := lo; d <= hi; d++ {
// 下一个位置奇偶性翻转
res += dfs(i+1, diff+(1-i%2*2)*d,
limitLow && d == lo, limitHigh && d == hi)
}
return
}
return dfs(0, 0, true, true)
}

func main() {
low := int64(1)
high := int64(100)
result := countBalanced(low, high)
fmt.Println(result)
}

Python完整代码如下:

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

def count_balanced(low: int, high: int) -> int:
if high < 11:
return0

low = max(low, 11)
low_str = str(low)
high_str = str(high)
n = len(high_str)
diff_lh = n - len(low_str)

# 记忆化数组:memo[i][diff_offset]
# diff 的取值范围:[-max_diff, max_diff],max_diff = (n // 2 + (n % 2)) * 9
max_possible_diff = ((n + 1) // 2) * 9
memo = [[-1] * (2 * max_possible_diff + 1) for _ in range(n)]

def dfs(i: int, diff: int, limit_low: bool, limit_high: bool) -> int:
if i == n:
return1if diff == 0else0

# 记忆化:只有当不受 low 和 high 限制时才能复用
if not limit_low and not limit_high:
idx = diff + max_possible_diff
if memo[i][idx] != -1:
return memo[i][idx]

lo = 0
if limit_low and i >= diff_lh:
lo = int(low_str[i - diff_lh])

hi = 9
if limit_high:
hi = int(high_str[i])

total = 0
for d in range(lo, hi + 1):
# 根据位置 i 的奇偶性决定 diff 的增减
# i=0 是最高位(视为偶数位,与 Go 版本一致)
sign = 1if i % 2 == 0else-1
total += dfs(i + 1, diff + sign * d,
limit_low and d == lo,
limit_high and d == hi)

if not limit_low and not limit_high:
memo[i][diff + max_possible_diff] = total
return total

return dfs(0, 0, True, True)

if __name__ == "__main__":
low_val = 1
high_val = 100
result = count_balanced(low_val, high_val)
print(result)

C++完整代码如下:

  





using namespace std;

long long countBalanced(long long low, long long high) {
// 最小的满足要求的数是 11
if (high < 11) {
return0;
}

low = max(low, 11LL);
string lowS = to_string(low);
string highS = to_string(high);
int n = highS.length();
int diffLH = n - lowS.length();

// 初始化记忆化数组,使用 -1 表示未计算
vector > memo(n, vector (n * 9 + 1, -1));

// 使用函数对象实现递归
function int , int , bool , bool )> dfs = [&]( int i, int diff, bool limitLow, bool limitHigh) -> long long {
if (i == n) {
return diff == 0 ? 1 : 0 ;
}

if (!limitLow && !limitHigh) {
int idx = diff + n / 2 * 9 ;
if (idx >= 0 && idx < n * 9 + 1 && memo[i][idx] != -1 ) {
return memo[i][idx];
}
}

int lo = 0 ;
if (limitLow && i >= diffLH) {
lo = lowS[i - diffLH] - '0' ;
}
int hi = 9 ;
if (limitHigh) {
hi = highS[i] - '0' ;
}

long long res = 0 ;
for ( int d = lo; d <= hi; d++) {
// 下一个位置奇偶性翻转
res += dfs(i + 1 , diff + ( 1 - i % 2 * 2 ) * d,
limitLow && d == lo, limitHigh && d == hi);
}

if (!limitLow && !limitHigh) {
int idx = diff + n / 2 * 9 ;
if (idx >= 0 && idx < n * 9 + 1 ) {
memo[i][idx] = res;
}
}

return res;
};

return dfs( 0 , 0 , true , true );
}

int main() {
long long low = 1 ;
long long high = 100 ;
long long result = countBalanced(low, high);
cout << result << endl;
return 0 ;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
太暖心!筱梅韩国出差,湾湾模特闺蜜现身陪伴

太暖心!筱梅韩国出差,湾湾模特闺蜜现身陪伴

圆梦的小老头
2026-08-12 08:23:25
大鱼来了!广东队迎来补强机会,“加强版奎因”有望加盟?

大鱼来了!广东队迎来补强机会,“加强版奎因”有望加盟?

绯雨儿
2026-08-12 09:59:45
紧急!2026税务大稽查全面开打!这3类行为一查一个准!

紧急!2026税务大稽查全面开打!这3类行为一查一个准!

细说职场
2026-08-12 10:58:07
武统还没开始,上百台军飞行员集体跑路,台专家:统一已有新模式

武统还没开始,上百台军飞行员集体跑路,台专家:统一已有新模式

万物知识圈
2026-08-11 09:45:05
海外爆火!周星驰将携《功夫女足》横扫全球院线,到底凭什么?

海外爆火!周星驰将携《功夫女足》横扫全球院线,到底凭什么?

小椰的奶奶
2026-08-12 03:48:11
老戏骨秦焰去世!同病房人曝死因,两月前就有征兆,奈何一直硬扛

老戏骨秦焰去世!同病房人曝死因,两月前就有征兆,奈何一直硬扛

吴蒂旅行ing
2026-08-12 04:44:47
芒特真的又伤了,缺席训练恐无缘热身赛!罗马为科内降价到5500万

芒特真的又伤了,缺席训练恐无缘热身赛!罗马为科内降价到5500万

罗米的曼联博客
2026-08-12 10:06:05
57岁保洁员掏空5万积蓄做医美

57岁保洁员掏空5万积蓄做医美

新快报新闻
2026-08-11 08:33:07
结婚四十年都是AA制!丈夫全屋装七八个监控设防,妻子:他怕我会害他

结婚四十年都是AA制!丈夫全屋装七八个监控设防,妻子:他怕我会害他

福建第一帮帮团
2026-08-10 20:56:16
百花奖这一夜:刘浩存美的惊心动魄,宋佳气场逆天,却被梅婷12岁女儿惊艳

百花奖这一夜:刘浩存美的惊心动魄,宋佳气场逆天,却被梅婷12岁女儿惊艳

娱乐圈笔娱君
2026-08-10 15:56:19
其实,女优比你想的更多!

其实,女优比你想的更多!

孤独的独角兽影视
2026-08-12 10:30:08
杭州捡垃圾17年老头离世,三个女儿撬开上锁铁盒,当场哭到站不起

杭州捡垃圾17年老头离世,三个女儿撬开上锁铁盒,当场哭到站不起

王姐懒人家常菜
2026-08-12 01:18:00
朱女士“富太太人设”遭舆论质疑!网友:08年到19年10年时间,两人因二胎问题产生矛盾

朱女士“富太太人设”遭舆论质疑!网友:08年到19年10年时间,两人因二胎问题产生矛盾

火山詩话
2026-08-12 05:56:31
66岁老人自述:我为什么坚决离开上海儿子家

66岁老人自述:我为什么坚决离开上海儿子家

有态度网友19Dsym
2026-08-12 08:25:11
你是怎么发现亲戚见不得你好的?网友:差距要造成断层才有意义

你是怎么发现亲戚见不得你好的?网友:差距要造成断层才有意义

另子维爱读史
2026-08-11 19:53:32
威斯康星州州长初选:社会主义者洪美兰未获AOC背书,党内分歧引关注

威斯康星州州长初选:社会主义者洪美兰未获AOC背书,党内分歧引关注

碳基打工人
2026-08-12 02:08:35
吊梢眉、眯眯眼,一个个精神萎靡,清华博士丑化红军战士,引起全网怒火:必须严查重罚!

吊梢眉、眯眯眼,一个个精神萎靡,清华博士丑化红军战士,引起全网怒火:必须严查重罚!

谭谈社会
2026-08-11 21:36:52
伊朗找乌克兰伸手要钱,不掏钱立刻攻入基辅,泽连斯基道歉也没用

伊朗找乌克兰伸手要钱,不掏钱立刻攻入基辅,泽连斯基道歉也没用

共工之锚
2026-08-12 00:34:42
男子上班脑出血 家属拔管后死亡 人社局认定抢救超48小时不属工伤

男子上班脑出血 家属拔管后死亡 人社局认定抢救超48小时不属工伤

闪电新闻
2026-08-12 10:47:31
央视专访蔡磊全程催泪!病情已到终末期,给儿子留了特殊“礼物”

央视专访蔡磊全程催泪!病情已到终末期,给儿子留了特殊“礼物”

阿晪美食
2026-08-11 18:23:52
2026-08-12 13:47:00
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1388文章数 79关注度
往期回顾 全部

科技要闻

Claude又出骚操作 改个错字也要留AI水印?

头条要闻

行长套取2100万获刑:3100万的万柳书院月供9万压力大

头条要闻

行长套取2100万获刑:3100万的万柳书院月供9万压力大

体育要闻

乔丹鲨鱼们的合同:1996,史上最伟大夏天

娱乐要闻

陈思诚恋情疑云再起

财经要闻

李嘉诚,再一次大撤退!他嗅到了什么?

汽车要闻

闪充/天神之眼B/云辇-C 2027款海豹06售9.99万元起

态度原创

手机
健康
艺术
房产
军事航空

手机要闻

iOS 27 Beta 5调整液态玻璃滑块,苹果提升最高透明度档位效果

心血管专家破解猝死八大谣言

艺术要闻

只租20年,她在京郊为父母造养老小院:比买房值

房产要闻

突发,崖州湾又有大动作!

军事要闻

通过“毕业大考” 湖北舰“持证上岗”

无障碍浏览 进入关怀版