【问题标题】:Function To Count occurrence of given string计算给定字符串出现次数的函数
【发布时间】:2022-01-17 23:52:45
【问题描述】:
#include<iostream>
using namespace std;
void check_exist_get_count(string str,char ch)
{
    int counter=0;
    for(int x=0;x<str.length();x++)
    {
        if(str[x]==ch)
            counter++;
    }
    cout<<ch<<" : "<<counter;
}
int main ()
{
    string str;
    cin>>str;
    for(int x=0;x<str.length();x++)
    {
        check_exist_get_count(str,str[x]);
    }



    return 0;
}

如果没有内置函数,我需要计算字母的出现,但我有问题我应该使用什么条件来检查哪个 for 循环不发送超过一次的字母 示例:在我的代码中我得到 输入 aaabbc 输出

a:3a:3a:3b:2b:2c:1

但要求的答案应该是

a : 3 b : 2 c : 1

【问题讨论】:

  • 外循环的目的是什么?代码的预期和实际输出是什么?请发布minimal reproducible example,包括对期望和实际行为的解释。

标签: c++ algorithm


【解决方案1】:

您只是在 main 函数中对字符串进行了一次迭代,对于该字符串中的每个字符,再次遍历整个字符串并计算其中有多少这样的字符。

您不做的是跟踪您已经数过哪些字符,这就是您多次数数的原因。不要嵌套循环(在第一个循环中调用你的函数),而是将这些东西分开:

一种选择是对字符串进行第一次传递,在其中您只需构建字符串中的字符列表,如下所示:

std::set<char> chars;
for (char c: str)
{
    chars.insert(c);    // a set doesn't allow duplicate entries
    // so you don't have to check yourself if it's already in there
}

然后,您可以在第二个循环中为集合中的每个字符调用 count。但是,这仍然是低效的;您可以使用地图来跟踪到目前为止的字符以及它们的数量。像这样的:

计算字符频率直方图的代码可能如下所示:

#include <iostream>
#include <map>
#include <string>

int main ()
{
    std::string str("aaabbc");
    std::map<char, size_t> charHistogram;
    for (char c: str)
    {
        // if c not contained in map yet, it's automatically initialized to 0
        ++charHistogram[c];
    }
    for (auto const & p: charHistogram)
    {
        std::cout << p.first << " : " << p.second << " ";
    }
    return 0;
}

code in cpp.sh

【讨论】:

  • 有没有在不使用库或内置函数的情况下实现此代码??
  • 我想这是一个家庭作业然后;)?当然有可能,但它变得有点困难。你必须自己实现类似地图的东西。您不允许使用任何 std:: 容器类型吗?对于这种情况,一个简单的版本可能是两个数组:一个字符,存储您已经涵盖的字符;第二个,存储遇到的此类字符的计数(具有匹配的索引 - 即索引 0 处的第一个条目将是字符数组中的“a”,最后是计数数组中的 3)
  • @codeling bool seen[256] 查找表呢?
  • @Quimby 只会解决挑战的第一部分 - 找出存在哪些字符,不是吗?如果您不关心内存(有 256 个可能的条目在任何情况下都可能不是真正的问题),您也可以或多或少地直接使用 int charHistogram[256] = {}; 而不是上面代码中的映射......然后检查哪些条目是!= 0
  • 你为什么要使用map.find?请直接写charHistogram[c]++; 并删除其他内容。
【解决方案2】:

添加到@codeling 答案的另一个选项。相同的想法,但不同的实现:

  • 您可以使用数组来计算使用过的字母。 第一个数组位置将告诉您“a”的出现次数,“b”的第二个位置等等。
  • 您可以扩展它以计算大写字母和符号。
  • 您还可以将std::array 更改为size_t counts[26] 数组。

[Demo]

#include <array>
#include <iostream>  // cout
#include <string>

int main()
{
    const std::string s{"aaabbc"};
    std::array<size_t, 26> counts{};
    for (auto&& ch : s)
    {
        if (ch >='a' and ch <= 'z')
        {
            counts[ch - 'a']++;
        }
    }
    for (char i{0}; i < counts.size(); ++i)
    {
        if (counts[i])
        {
            std::cout << static_cast<char>('a' + i) << ": " << counts[i] << "\n";
        }
    }
}

【讨论】:

  • 这是一个很好的答案。我不确定案件是否重要。 C++ 标准解决方案将使用地图。无论如何+1
  • 谢谢。我也更喜欢这里的地图,是的;这几乎是编码的答案。但如果 OP 无法使用标准数据结构,他们可以轻松地将 std::array 更改为 C 数组,而其余部分保持不变。
猜你喜欢
  • 1970-01-01
  • 2012-06-24
  • 2011-07-08
  • 2019-10-12
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多