【问题标题】:Calculate occurance of each character in a string without using count in C++在 C++ 中不使用 count 计算字符串中每个字符的出现次数
【发布时间】:2017-10-28 19:19:12
【问题描述】:

这是我的代码:

#include <iostream>
#include <string>
using namespace std;

void calc(string s){
    for(int i = 0;i < s.size();++i){
        int count = 1;
        for(int j = i + 1;j <s.size();++j){
            if(s[i] == s[j]){
                count += 1;
            }
        }
        cout << s[i] <<"(" << count << ")" << " ";
    }

}


int main(){
    string str;
    while(cin >> str){
        calc(str);
    }

}

一切正常,除了我想遍历字符串中的唯一字符并且我不知道如何实现它。 你能帮我吗?

【问题讨论】:

  • 这段代码甚至没有尝试这样做吗?
  • @ChiefTwoPencils 实际上,确实如此。但它遍历整个字符串,但我想遍历字符串的唯一字符
  • 您正在寻找每个字符的计数或字符串中有多少个唯一字符的计数?你的措辞令人困惑。

标签: c++ string unique


【解决方案1】:

有很多方法可以做到这一点。以下是一些建议:

  1. 修改您编写的代码,以便在计算一个字符出现在当前字符之后的次数之前,首先扫描字符串中您之前的字符,看看它们是否匹配。如果是这样,跳过当前字符。

  2. 每次找到与当前字符匹配的字符时,将其替换为字符串中第一个字符的副本。然后,每当您访问字符串中不在第一个位置的字符时,请检查它是否与字符串中的第一个字符匹配。如果是这样,您已经扫描过了。如果没有,请计算其出现次数。

  3. 维护一个辅助数据结构(数组、哈希表等),将字符映射到它们的频率。通过遍历原始字符串来填充表格,然后遍历具有唯一键的表格以打印所有内容。

  4. 对字符串进行排序。计算每个字符出现的次数然后归结为找到字符串中每个连续字符的长度。

如果您不能修改原始字符串并且不允许使用其他数据结构,则选项 (1) 很好。如果允许您修改原始字符串,选项 (2) 具有出色的时间和空间要求。选项 (3) 可能是最容易编写代码的,但比其他方法使用更多空间。选项 (4) 也很容易编写代码,如果您使用诸如堆排序之类的东西,它的内存使用率很高,但仍然比选项 (2) 慢。

【讨论】:

  • 谢谢你,我使用了你的 2 条建议,它奏效了!其实我知道如何用 Python 编写代码(很简单),但我是 C++ 新手,风格完全不同:)谢谢你的帮助!
【解决方案2】:

为什么不维护一个长度为26的辅助数组,将其初始化为0,然后每次遇到字符时将相应索引的值加1?

伪代码:

auxArray[26] = [0] // 26 length array initialized to zero
for character in string: // loop through every character in the string
    auxArray[character - 'a']++; //increment the corresponding index value by 1

print auxArray //print the entire array. [0] will give you count of 'a', and [25] will give you count of 'z'

这是假设您有一个从 'a' 到 'z' 的字符串(全部小写)。

如果我们也有大写-小写混合字符,您可能会使用类似的东西,而是使用 128 的数组。在这种情况下,您不必减去 'a',因为它正在完成以容纳带有字符的索引。

auxArray[128] = [0]
for character in string:
    auxArray[character]++;

for index in auxArray:
    print(((char)index) + " Count is " + auxArray[index])

【讨论】:

  • 在这种情况下你可以取长度 52 吗?还是62?或者最坏的情况,你可以为 ASCII 取一个长度为 128 的数组?
  • @RetiredNinja 好的,让我来做吧:p
  • @RetiredNinja 完成。 :)
【解决方案3】:

另一种方法是使用std::map

std::map<char,int> count;

for (int i = 0; i < s.size(); ++i)
    count[s[i]]++;
for (auto iter = s.begin(); iter != s.end(); ++iter)
    std::cout << iter->first << “: “ << iter->second << ‘\n’;

未测试,抱歉。

【讨论】:

    猜你喜欢
    • 2022-10-15
    • 1970-01-01
    • 2023-02-04
    • 2020-07-23
    • 2016-01-23
    • 1970-01-01
    • 2011-04-21
    • 2013-12-02
    • 1970-01-01
    相关资源
    最近更新 更多