梦中的统计

## 题目背景

Bessie 处于半梦半醒的状态。过了一会儿,她意识到她在数数,不能入睡。

## 题目描述

Bessie 的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码($0 \ldots 9$):每一个数码在计数的过程中出现过多少次?

给出两个整数 $M$ 和 $N$,求在序列 $[M, M + 1, M + 2, \ldots, N - 1, N]$ 中每一个数码出现了多少次。

## 输入格式

第 $1$ 行: 两个用空格分开的整数 $M$ 和 $N$。

## 输出格式

第 $1$ 行: 十个用空格分开的整数,分别表示数码 $0 \ldots 9$ 在序列中出现的次数。

## 样例 #1

### 样例输入 #1

```
129 137
```

### 样例输出 #1

```
1 10 2 9 1 1 1 1 0 1
```

## 提示

数据保证,$1 \leq M \leq N \leq 2 \times 10^9$,$N-M \leq 5 \times 10^5$。

##思路

最开始我想的是通过字符串方式把他合并之后在进行统计,但测试发现这样很容易超时,像下面这种

s=''
M,N=map(int,input().split())
for i in range(M,N+1):
    s+=str(i)
for i in range(0,10):
   print(s.count(str(i)),end=' ')

后面我发现,这种题的本质就是对数位的统计,和取位是一样的,可以使用取余数的方法来统计,不过这样就得开辟新的空间,

l=[0]*10
M,N=map(int,input().split())
for i in range(M,N+1):  #for控制数据输入
    num=i
    while num>0: # 对取到的数操作
        b=num%10 # 取得个位
        num=num//10 # 去掉个位
        l[b]+=1  # 添加进数组
for i in l:
    print(i,end=' ')

这里开辟了一个列表来保存数据,数组长度会随着数据变大而改变,所以空间复杂度是O(n) 时间复杂度是O(n^2)

下面是c语言代码

#include<stdio.h>
int main() {
    int i, n1, n2, b;
    int a[10] = {0};
    scanf("%d %d", &n1, &n2);
    for (i = n1; i <= n2; i++) {
        int num = i;
        while (num > 0) {
            b = num % 10;
            num = num / 10;
            a[b]++;
        }
    }
    for (i = 0; i < 10; i++) {
        printf("%d ", a[i]);
    }
    return 0;

}

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值