PTA天梯赛练习题 L1-003 个位数统计


在这里插入图片描述
PTA | 程序设计类实验辅助教学平台

思路简析

思路一:
我的思路很简单,通过取余判断末尾数字,再不断初始更新末尾,然后用c++中的map容器来存储结果。但是在面对测试集的时候却怎么也通不过。
image.png
仔细看题目之后发现给出的数字是1000位的正整数,即便是long long类型可能也无法完整存储下来,所以才会出现错误。

思路二:
题中的N为1000位数,所以用字符串来表示。为了与思路一有些区别,这里用数组哈希表来存储结果,下标为0~9,其值均为0。遍历某个字符对应的数字,则该数字下标的值+1。


解法代码

思路一

#include<iostream>
#include <map>
using namespace std;
int main() {
    int N;
    cin >> N;
    map<int, int> map; //key:数字类型,value:数字出现的次数
    while (N) {
        map[N % 10]++;   //取余判断末尾数字,存放到map中
        N = N / 10;       //更新末尾数字
    }
    for (auto iter = map.begin(); iter != map.end(); iter++) {   
        cout << iter -> first << ':' << iter -> second << endl;
    }
    return 0;
}

思路二

#include<iostream>
#include<string>
using namespace std;
int main() {
    string s;
    cin >> s;
    int hash[10] = {}; //用一个哈希表来记录每个数字出现的次数,初始默认为0
    for (int i = 0; i < s.length(); i++) {
        for (int j = '0'; j <= '9'; j++) {
            if (s[i] == j) {
                int n = j - '0';     //这样可以将数字字符转为数字
                hash[n]++;
            }
        }
    }
    for (int k = 0; k < 10; k++) {
        if (hash[k] != 0) {
            cout << k << ':' << hash[k] << endl;
        }
    }
    return 0;
}



总结反思

  1. 第一次做的时候没认真读题,用int来做
  2. int n = j - ‘0’; //这样可以将数字字符转为数字
  3. 对于c++中的map的用法还是不熟练,是在查阅资料后才写出来的
#include<iostream>
#include<map>  //注意添加头文件
using namespace std;
int main() {
    map<int, int> map;  //定义,<key, value>,  key相当于数组下标,value相当于值
    
    map[1] = 4;  //向 map 容器添加新键值对, key = 1, value = 4
    
    map[1] = 3;  //修改 map 容器已存储键值对中,指定键对应的值
    
    //遍历输出,first为key, second为value
    for (auto iter = map.begin(); iter != map.end(); ++iter) {
        cout << iter->first << " " << iter->second << endl;
    }

    //查找元素是否存在的2种方式
    //第一种,通过键直接查找,如果存在就返回对应的值,如果不存在则返回0
    //第二种,map.find(key),返回key对应的迭代器,如果不存在则返回map.end(),时间复杂度为O(logN)
    if (map.find(1) == map1.end())
		cout << "NOT FONUND" << endl;
}

此外
image.png
这里的有序指的是key, 一般map默认从小到大排列,
map<string,int> hash; 等价于 map<string,int, less> hash;
若要变为从大到小排列
map<string,int, greater> hash;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值