用c++计算字符数和出现时间
Count number of characters and appear time in c++
假设我有一个包含文本消息的字符数组,例如:
"abccddcabbef"
现在我想数一下角色的数量和每个角色的出现时间。结果将是两个阵列:
char a[6] = {'a', 'b', 'c', 'd', 'e', 'f'} // array of character
int b[6] = {2, 3, 3, 2, 1, 1} // appear time
哪种方法最好?
对不起我的英语!
为什么不这样做:创建一个std::unordered_map
,其键是字符,其值是int。
例如:
unordered_map<char, int> map;
string inputText;
for (int i = 0; i < inputText.size(); ++i)
{
map[inputText[i]]++;
}
现在,您可以迭代这个映射,并可以找出到目前为止您所看到的实际字符作为映射的键,以及到目前为止每个字符出现的次数作为映射的值。
我的答案是基于这样一个假设,即您提前知道结果所需的数组长度。如果你事先不知道这些信息,我建议使用List或ArrayList的char。
但是,根据你的问题,这是我会做的
int aCurrentIndex = 0;
for (i = 0; i < origArray.length; i++) {
if (!a.contains(origArray[i])) {
a[aCurrentIndex] = origArray[i];
b[aCurrentIndex] = 1;
aCurrentIndex++;
}
else {
b[a.indexOf(origArray[i])] = b[a.indexOf(origArray[i])] + 1;
}
}
在else语句中,您可能可以使用以下语句,但我还没有测试过,也不想告诉您错误。
b[a.indexOf(origArray[i])]++;
好吧,如果假设输入字符串str
小于128,那么你知道总是会有小于strlen(str)
的唯一字符。
因此,您可以执行以下操作:
std::string str = "abcabx";
char a[str.length()];
unsigned size[str.length()];
// zero arrays
memset(a, 0, str.length());
memset(size, 0, str.length() * sizeof(unsigned));
unsigned num_unique = 0;
for (char x : str) {
unsigned i = 0;
while (a[i] != ' ' && a[i] != x) ++i;
num_unique = std::max(i+1, num_unique);
a[i] = x;
++size[i];
}
for (unsigned i = 0; i < num_unique; ++i) {
std::cout << a[i] << " - " << size[i] << std::endl;
}
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 从持续时间构造std::chrono::system_clock::time_point
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 从文本文件中读取时钟时间和事件时间并进行处理
- 具有未知值时的时间复杂性
- 如何减少花费的时间
- C++在变量给定的指定时间内关闭电脑
- rcpp函数中的清理时间很长
- C++:floor unix时间戳到UTC月份
- 如何在c++中录制具有精确帧时间戳的视频
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- KMP算法和LPS表构造的运行时间
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 使用Boost Interprocess创建托管共享内存需要很长时间