题目ID:L1-003 分数:15分 语言:Java、Python
题目描述
给定一个 k 位整数 N = dk-1×10k-1 + ⋯+d1×101 + d0 (0 ≤ di ≤ 9, i = 0,⋯,k −1, dk-1 > 0),请编写程序统计每种不同的个位数字出现的次数。
例如:给定 N = 100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式
对 N 中每种不同的个位数字,以 d:M 的格式在一行中输出该数字和它出现的次数,数据间以空格分隔。
注意:在 d:M 中,d 为数字出现的次数为 0 时,不输出该数字。
输出格式要求按照 d 的升序顺序输出。
样例
输入样例:
100311
输出样例:
0:2
1:3
3:1
解题思路
核心算法:字符串处理 + 数组计数
- 读取输入:将大整数作为字符串读取(避免位数限制)
- 统计计数:遍历字符串,使用数组
cnt[10]统计 0-9 每个数字出现的次数 - 输出结果:按升序遍历数组,输出出现次数大于 0 的数字及其次数
关键点:
- 使用字符串处理,避免大整数超出
int或long范围 - 使用
char - '0'将字符转换为数字 - 按升序输出,直接遍历数组 0-9
代码实现
Java 实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String n = scanner.next();
int[] cnt = new int[10];
for (char c : n.toCharArray()) {
cnt[c - '0']++;
}
for (int i = 0; i < 10; i++) {
if (cnt[i] > 0) {
System.out.println(i + ":" + cnt[i]);
}
}
}
}
Python 实现
n = input().strip()
cnt = [0] * 10
for ch in n:
cnt[int(ch)] += 1
for i in range(10):
if cnt[i] > 0:
print(f"{i}:{cnt[i]}")
运行验证
Java 运行结果:
0:2
1:3
3:1
Python 运行结果:
0:2
1:3
3:1
复杂度分析
- 时间复杂度:O(k),其中 k 为整数位数,只需遍历一次字符串
- 空间复杂度:O(1),只需固定大小为 10 的计数数组
总结
本题是一个经典的数字统计问题,关键点在于:
- 将大整数作为字符串处理,避免位数限制
- 使用数组统计 0-9 每个数字的出现次数
- 按升序输出结果,直接遍历数组即可
这道题考察了字符串操作和数组计数的基础知识,适合作为入门级别的练手题。