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

2026-07-08:统计区间内奇妙数的数目。用go语言,给定一个正整数 n,我们要考虑从 1 到 n 之间(包括 1 和 n)的所有整数。对每个数,按

0
分享至

2026-07-08:统计区间内奇妙数的数目。用go语言,给定一个正整数 n,我们要考虑从 1 到 n 之间(包括 1 和 n)的所有整数。对每个数,按照常见的千位分隔习惯写成字符串:从个位开始向左数,每三位插入一个逗号,但如果这个数不足四位(也就是小于 1000),则不加任何逗号。问题是:把 1 到 n 这 n 个数的这种书写形式连起来看,总共出现了多少个逗号?请计算出这个总数。

1 <= n <= 100000。

输入: n = 1002。

输出: 3。

解释:

数字 "1,000"、"1,001" 和 "1,002" 每个都包含一个逗号,总计 3 个逗号。

题目来自力扣3870,3871。

一、函数 countCommas(n int64) 分步逻辑拆解 步骤1:定义变量k,k代表每个数字固定拥有的逗号个数档位

k 是完整千位段的数量,对应数字统一携带的逗号数量:

  • • 数字区间 [10^(3 m), 10^(3 m+3)-1] 内所有数,都固定有 m 个逗号
    m=0:1 999,k=0,无逗号
    m=1:1000 999999,k=1,1个逗号
    m=2:1000000~999999999,k=2,2个逗号
    以此类推

步骤2:计算k的核心逻辑 2.1 特殊边界说明

当 n = 10^15 时,浮点数 math.Log10 会存在精度丢失,无法正确算出位数,因此代码预设兜底 k=5;题目限制 n≤100000,不会触发该特判,仅为超大数兼容。

2.2 常规n<1e15时的k计算流程

  1. 1. 将整数n转为浮点数,调用 math.Log10 得到n的十进制位数减1:
    例 n=1002,log10(1002)≈3.000867

  2. 2. 对结果取整数,得到数字总位数减1:int(3.000867)=3

  3. 3. 整除3,得到完整千位段数量k:3 / 3 = 1
    含义:1002属于1000~999999区间,每个数字固定1个逗号,k=1

步骤3:拆分总逗号的数学公式推导

总逗号 = 两部分相减:
总逗号 = k × (n + 1) − 前k个完整千位区间全部数字产生的逗号总和

第一部分:k × (n+1)

假设从1到n所有数字都有k个逗号,先算出理论最大值。
示例 n=1002,k=1:1 × (1002+1) = 1003
含义:假设1~1002每个数字都带1个逗号,合计1003个逗号。

第二部分:(10^(3k+3) − 1000) / 999

这一步计算1 ~ (10^(3k)-1) 所有数字实际不含k个逗号的总差值,也就是需要扣除的无效逗号数量。

  1. 1. 3k:完整千位段对应的位数偏移,k=1时 3k=3

  2. 2. 3k+3 = 6,10^6 = 1000000

  3. 3. 10^6 − 1000 = 999000

  4. 4. 除以999:999000 / 999 = 1000
    含义:1~999 这1000个数字,本身没有1个逗号,前面理论计算时给它们全部算了1个逗号,多算了1000个,需要全部减去。

步骤4:合并公式计算最终答案

代入示例 n=1002:
总逗号 = 1003 − 1000 = 3,和题目输出完全匹配。

通用公式数学意义

  1. 1. k 代表当前数字档位的标准逗号数;

  2. 2. k*(n+1):给1~n全部数字强制分配k个逗号,得到高估总和;

  3. 3. 减数项:统计所有小于10^(3k)的数字总个数,这些数字本身不足k个逗号,全部是多算的部分,需要扣除;

  4. 4. 相减后得到真实总逗号数量。

步骤5:main函数执行流程
  1. 1. 定义输入n=1002,转为int64类型传入countCommas;

  2. 2. 执行上述数学计算得到结果;

  3. 3. 打印输出最终逗号总数。

二、整体算法核心思想总结

不暴力遍历1~n逐个统计(避免循环),利用十进制千位分段数学公式直接计算,按数字所在区间批量统计逗号:

  1. 1. 先确定当前数字所在千位分段,得到该分段标准逗号数k;

  2. 2. 用整体高估法,统一给所有数字分配k个逗号;

  3. 3. 减去低位区间(不足k个逗号)的数字总数,修正高估误差;

  4. 4. 一步算出总逗号,无循环、无逐一枚举。

三、时间复杂度 & 额外空间复杂度分析 1. 时间复杂度 O(1)

整个计算仅执行常数次数学运算:log10、整数转换、幂运算、四则加减乘除,不存在循环、递归、遍历操作,运算次数不随n的大小变化,固定常数次计算,时间复杂度为常量级 O(1)。

2. 额外空间复杂度 O(1)

函数内部仅定义固定数量局部变量(k、ans,无动态数组、切片、哈希、递归栈等动态内存),分配的内存空间大小与输入n无关,始终为固定常量空间,额外空间复杂度 O(1)。

Go完整代码如下:

package main

import (
"fmt"
"math"
)

func countCommas(n int64) (ans int64) {
k := 5// n == 1e15 时 Log10(n) 有误差,需要特判
if n < 1e15 {
k = int(math.Log10(float64(n))) / 3
}
returnint64(k)*(n+1) - (int64(math.Pow10(k*3+3))-1000)/999
}

func main() {
n := 1002
result := countCommas(int64(n))
fmt.Println(result)
}

Python完整代码如下:

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

def count_commas(n: int) -> int:
"""
返回从 1 到 n(含)所有整数的标准书写格式中逗号的总数
"""
if n < 1000:
return0
# k 表示最高位的逗号组数,例如 n=1000 时 k=1,n=1_000_000 时 k=2
k = (len(str(n)) - 1) // 3
# 使用公式:k*(n+1) - (10^(3k+3) - 1000) / 999
pow10 = 10 ** (3 * k + 3)
return k * (n + 1) - (pow10 - 1000) // 999

if __name__ == "__main__":
n = 1002
result = count_commas(n)
print(result)

C++完整代码如下:

  




int64_t countCommas(int64_t n) {
int k = 5; // 当 n >= 1e15 时直接取 5,避免 log10 的精度误差
constexpr int64_t threshold = 1000000000000000LL; // 1e15
if (n < threshold) {
k = static_cast(std::log10(static_cast (n))) / 3;
}
int64_t pow10 = static_cast (std::pow( 10.0, k * 3 + 3));
return static_cast (k) * (n + 1) - (pow10 - 1000) / 999;
}

int main() {
int64_t n = 1002;
int64_t result = countCommas(n);
std::cout << result << std::endl;
return0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的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.

相关推荐
热点推荐
全网吵翻!首部AI电视剧正式登陆卫视,画面绝美却被吐槽没人味

全网吵翻!首部AI电视剧正式登陆卫视,画面绝美却被吐槽没人味

何揎室内设计
2026-08-06 23:04:32
5800万年轻人不交社保了:断缴的不是懒惰,是生存的算术

5800万年轻人不交社保了:断缴的不是懒惰,是生存的算术

互联网大观
2026-07-21 10:03:18
欧菲光公告炸场!正式入局玻璃基板,吞下中科院王牌!

欧菲光公告炸场!正式入局玻璃基板,吞下中科院王牌!

故事终将光明磊落
2026-08-07 10:22:05
黄金创今年以来最佳表现

黄金创今年以来最佳表现

第一财经资讯
2026-08-08 09:06:43
《龙餐馆》破100万,韩东君第一个包场,沈腾的号召力顶流比不了

《龙餐馆》破100万,韩东君第一个包场,沈腾的号召力顶流比不了

白公子探剧
2026-08-06 15:13:45
台风“白海豚”登陆后是否会北上?将影响哪些地方?

台风“白海豚”登陆后是否会北上?将影响哪些地方?

极目新闻
2026-08-07 13:18:27
高铁安检“三不带”正式明确!带上车直接拦截,大量旅客频频踩坑

高铁安检“三不带”正式明确!带上车直接拦截,大量旅客频频踩坑

笔墨V
2026-08-07 09:59:06
小S与女儿Lily合拍广告,星二代的起点令人羡慕

小S与女儿Lily合拍广告,星二代的起点令人羡慕

嘴角上翘的弧度
2026-08-08 09:16:41
马未都见识有多广:这两样东西千万不要往家搬,听完让人醍醐灌顶

马未都见识有多广:这两样东西千万不要往家搬,听完让人醍醐灌顶

心理观察局
2026-08-08 07:51:09
太意外了!2032奥运举办地敲定:结果惊呆众人,奥运格局大变!

太意外了!2032奥运举办地敲定:结果惊呆众人,奥运格局大变!

小涛叨叨
2026-04-22 17:06:20
日媒:守田英正曾明确表示反对佐野海舟回归日本国家队

日媒:守田英正曾明确表示反对佐野海舟回归日本国家队

懂球帝
2026-08-07 15:36:10
玄学现象:当你财路不顺时,尽量多去这4个地方,去的越多越顺

玄学现象:当你财路不顺时,尽量多去这4个地方,去的越多越顺

富书
2026-07-23 12:28:15
河南三支一扶大规模作弊实锤!蔡树峰被停职,数万考生等到公道

河南三支一扶大规模作弊实锤!蔡树峰被停职,数万考生等到公道

次元君情感
2026-08-08 03:49:14
日本发出强硬警告,如果中国继续实施导弹试射,我们就加速拥核!

日本发出强硬警告,如果中国继续实施导弹试射,我们就加速拥核!

棠棣分享
2026-08-03 12:40:15
曼晚:曼联考虑匹配博洛尼亚对卢库米的2500万欧元转会要价

曼晚:曼联考虑匹配博洛尼亚对卢库米的2500万欧元转会要价

懂球帝
2026-08-08 06:37:05
煮熟也有毒 这5种菜赶紧扔 别拿全家性命开玩笑

煮熟也有毒 这5种菜赶紧扔 别拿全家性命开玩笑

坠入二次元的海洋
2026-08-08 03:56:33
iPhone 17 降价两千多,等等党这次真的赢了

iPhone 17 降价两千多,等等党这次真的赢了

小柱解说游戏
2026-08-08 04:58:43
美国已走到死路,再砸多少都搞不定伊朗?美媒证实:美军已经认栽

美国已走到死路,再砸多少都搞不定伊朗?美媒证实:美军已经认栽

徐竦解说
2026-08-08 07:31:43
伊朗内部非常困难,但革命卫队完全不在乎

伊朗内部非常困难,但革命卫队完全不在乎

修明札记
2026-08-07 22:57:32
当不成总统了?特朗普健康“恶化”,被曝恶疾缠身,比拜登还严重

当不成总统了?特朗普健康“恶化”,被曝恶疾缠身,比拜登还严重

小七七七七
2026-08-07 11:46:38
2026-08-08 09:48:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1380文章数 78关注度
往期回顾 全部

科技要闻

OpenAI新模型网络攻击能力引发警惕 延期发布

头条要闻

牛弹琴:中东迎来历史性一天 美国以色列肯定五味杂陈

头条要闻

牛弹琴:中东迎来历史性一天 美国以色列肯定五味杂陈

体育要闻

去年信誓旦旦3000万 今年NBA查无此人

娱乐要闻

周也热恋结束,六个字暴露单身状态

财经要闻

一枚“回旋镖”,击中王思聪

汽车要闻

越7全球首秀 传祺开始进攻方盒子越野

态度原创

艺术
健康
家居
教育
公开课

艺术要闻

江泽民同志颜体题词一览

打干细胞会不会诱发癌症?

家居要闻

2026建博会(广州) 公装联探展交流活动

教育要闻

三年级竖式数字谜,抓住竖式计算的本质

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版