PTA刷题Basic篇——1021个位数统计——Day(11)

又是凌晨更新的一篇博客,发现自己最近经常在凌晨刷PTA,可能是因为乙级简单,到了晚上思路也很清晰,leetcode就不敢凌晨刷。但是现在也慢慢发现了,越往后题目越有坑,而且还真的不知道坑在哪里,只能换一种方法去避免这个坑,比如今天这两道题,个人认为坑都不小,如果有朋友知道我哪里出问题,希望可以给我评论或者私信我。具体问题我会在下文提出

题目描述

在这里插入图片描述
统计每个数字出现的个数,并将数字从小打大排序输出。

题目分析

我最初的想法是:因为这个数字一定是0-9的,所以我们创建一个大小为10的静态数组,将每一位的数字作为索引,将出现次数存入。例如,3出现的次数就存在array[3]的位置。
那每一位的数字怎么得到呢?我想到的是,先得到数字的长度,然后将数字逐渐除以10的(长度-1)次方。得到的商就是该位数字。然后将被除数更新为余数,继续计算。
例如100311的长度为6,我们就用100311 / 10^(6-1) = 1,余数为311,再利用311进行除法运算,可以得到0,0,3,1,1。可是!!!理想很丰满,现实很骨感,最后一步得到的商不是1,而是0!!!也就是说1 / 1 = 0 ??????所以我的答案错了,我也不知道问题在哪里,所以有懂的朋友可以评论告诉我,初步认定是因为pow(10,n)这个函数有点问题,因为下一题我也用了这个函数,结果仍然等于预期结果-1。
所以我换了一种方法,使用简单的字典操作,也就是map,将对应的数字作为键值,出现次数作为字典值存入字典,字典初始化为0,最后将不为0的元素按照指定格式输出。

代码

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <string.h>
#include <map>
using namespace std;
int main()
{
    string s;
    cin >> s;
    //使用字典
    map<int, int> mp;
    for (int i = 0; i < 10; i++)
    {
        mp[i] = 0;
    }
    for (int i = 0; i < s.length(); i++)
    {
        int t = s[i] - '0';
        mp[t]++;
    }
    for (int i = 0; i < 10; i++)
    {
        if (mp[i] != 0)printf("%d:%d\n", i, mp[i]);
    }
    return 0;
}

总结

答题用时24min
Q21——finish√

发布了60 篇原创文章 · 获赞 2 · 访问量 1039

猜你喜欢

转载自blog.csdn.net/weixin_44755413/article/details/105592259
今日推荐