L1-003 个位数统计(15分)[java][python]

4 阅读2分钟

题目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

解题思路

核心算法:字符串处理 + 数组计数

  1. 读取输入:将大整数作为字符串读取(避免位数限制)
  2. 统计计数:遍历字符串,使用数组 cnt[10] 统计 0-9 每个数字出现的次数
  3. 输出结果:按升序遍历数组,输出出现次数大于 0 的数字及其次数

关键点

  • 使用字符串处理,避免大整数超出 intlong 范围
  • 使用 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 的计数数组

总结

本题是一个经典的数字统计问题,关键点在于:

  1. 将大整数作为字符串处理,避免位数限制
  2. 使用数组统计 0-9 每个数字的出现次数
  3. 按升序输出结果,直接遍历数组即可

这道题考察了字符串操作和数组计数的基础知识,适合作为入门级别的练手题。