思路简析
思路一:
我的思路很简单,通过取余判断末尾数字,再不断初始更新末尾,然后用c++中的map容器来存储结果。但是在面对测试集的时候却怎么也通不过。
仔细看题目之后发现给出的数字是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;
}
总结反思
- 第一次做的时候没认真读题,用int来做
- int n = j - ‘0’; //这样可以将数字字符转为数字
- 对于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;
}
此外
这里的有序指的是key, 一般map默认从小到大排列,
map<string,int> hash; 等价于 map<string,int, less> hash;
若要变为从大到小排列
map<string,int, greater> hash;