描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。
数据范围: 1≤n≤500
输入描述:
输入一行没有空格的字符串。
输出描述:
输出 输入字符串 中范围在(0~127,包括0和127)字符的种数。
示例1
输入:abc
输出:3
示例2
输入:aaa
输出:1
思路
1.这道题的重点是记录0~127中的每一个字符出现的次数。
2.看到这种键值对模式的题目,首先想到的就是使用std::map。
3.只需将map的key设置为字符的值,然后将value设置为字符出现的次数即可。
4.最后遍历整个map,统计value不为0的元素个数。
代码
CharCounter.h
#pragma once
#include <mutex>
class CharCounter
{
public:
static CharCounter* getInstance();
public:
void count();
private:
CharCounter() = default;
~CharCounter() = default;
private:
static CharCounter* instance;
static std::mutex iMutex;
};
CharCounter.cpp
#include "CharCounter.h"
#include <iostream>
#include <map>
CharCounter* CharCounter::instance = nullptr;
std::mutex CharCounter::iMutex;
CharCounter* CharCounter::getInstance()
{
std::unique_lock<std::mutex> lock(iMutex);
if (nullptr == instance) {
instance = new CharCounter();
}
return instance;
}
void CharCounter::count()
{
/* input */
std::string inputString;
std::cin >> inputString;
if (1 > inputString.size() || 500 < inputString.size()) {
std::cout << "Invalid argument" << std::endl;
return;
}
std::map<char, uint32_t> table;
for (int idx = 0; idx < inputString.size(); idx++) {
table[inputString[idx]]++;
}
uint32_t count = 0;
for (auto& ele:table) {
if (0 != ele.second) {
count++;
std::cout << ele.first << ":" << ele.second << std::endl;
}
}
std::cout << count << std::endl;
}
main.cpp
#include "CharCounter.h"
int main(int argc, char** argv)
{
auto counter = CharCounter::getInstance();
counter->count();
return 0;
}