🤖 AI总结
主题
一个计算整数数字频率得分的算法题及多种语言实现。
摘要
本文介绍计算整数数字频率得分的算法,通过逐位统计并加权求和,提供多语言实现,时间复杂度常数级。
关键信息
- 1 给定整数n,统计每位数字出现次数,计算数字乘以其出现次数之和。
- 2 提供Go、Python、C++三种实现。
- 3 时间复杂度O(1),空间复杂度O(1)。
2026-09-05:计算数字频率得分。用go语言,给定一个整数,先把它每一位上的数字都拆开,统计每个不同数字出现了多少次;然后用每个数字乘以其出现次数,再把所有这样的乘积相加,得到的最终总和就是该整数的得分。最后把这个得分作为整数返回。
1 <= n <= 1000000000。
输入: n = 122。
输出: 5。
解释:
数字 1 出现 1 次,贡献为 1 * 1 = 1。
数字 2 出现 2 次,贡献为 2 * 2 = 4。
因此,n 的得分为 1 + 4 = 5。
题目来自力扣3945。
大体步骤如下:
1.初始化统计容器:准备一个长度为 10 的整型数组(或字典),用于记录数字 0~9 各自出现的次数,初始值均为 0。
2.逐位拆分:对给定的整数 n 执行循环,只要 n > 0 就继续:
• 取当前 n 的末位数字,即n % 10。
• 在统计数组中,将该数字对应的计数加 1。
• 将 n 除以 10,去掉末位,进入下一位。
3.计算加权和:循环结束后,遍历所有数字 d 从 0 到 9:
• 若该数字的计数 freq[d] 大于 0,则计算d * freq[d],并将其累加到总分变量中。
4.返回结果:输出累加得到的整数,即为该整数的得分。
需要特别处理的是,如果 n 本身为 0(虽然题目约束 n≥1,但若存在,则统计数组全为 0,得分也为 0)。
时间复杂度:由于 n 的位数最多为 10 位(因为 n ≤ 1,000,000,000,即 10 亿,最多 10 位数字),循环拆分的次数不超过 10 次,遍历统计数组固定为 10 次,因此总操作次数为常数级别,时间复杂度为O(1)(或表示为 O(log n),其中 log 以 10 为底,但 n 有上限,故可视为常数)。
额外空间复杂度:仅使用了固定大小的数组(长度为 10)和几个整型变量,不随输入规模变化,因此额外空间复杂度为O(1)。
Go完整代码如下:
package main
import (
"fmt"
)
func digitFrequencyScore(n int) (ans int) {
for ; n > 0; n /= 10 {
ans += n % 10
}
return
}func main() {
n := 122
result := digitFrequencyScore(n)
fmt.Println(result)
}
![]()
Python完整代码如下:
# -*-coding:utf-8-*-
def digit_frequency_score(n: int) -> int:
ans = 0
while n > 0:
ans += n % 10
n //= 10
return ans
def main():
n = 122
result = digit_frequency_score(n)
print(result)if __name__ == "__main__":
main()
![]()
C++完整代码如下:
int digitFrequencyScore(int n) {
int ans = 0;
while (n > 0) {
ans += n % 10;
n /= 10;
}
return ans;
}int main() {
int n = 122;
int result = digitFrequencyScore(n);
std::cout << result << std::endl;
return 0;
}
![]()
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。