【问题标题】:C++ predicting majority of string array elegantly [duplicate]C ++优雅地预测大多数字符串数组[重复]
【发布时间】:2014-03-02 17:45:24
【问题描述】:

我有一个由 5 个字符串组成的数组,我希望能够将这些字符串相互比较,以确定是否存在多数,并返回该多数。所以如果:

a[0] = "dog";
a[1] = "dog";
a[2] = "dog";
a[3] = "dog";
a[4] = "cat";

我想返回“狗”。在 2 相同、2 相同和 1 的情况下,我希望它返回“没有多数”。有没有办法在没有大量 if 语句的情况下做到这一点,换句话说,优雅吗?

【问题讨论】:

  • 我不认为“预测”是正确的词。
  • 是否有总是 5 个字符串,或者您是否计划在某一天处理比这 5 个更多的字符串?

标签: c++ arrays


【解决方案1】:

你可以使用字典:

std::unordered_map<std::string, unsigned int> historgram;
std::string most_popular;
unsigned int m = 0;
bool unique = false;

for (s : a)
{
    unsigned int & i = histogram[s];
    ++i; 
    if (i == m) { unique = false; }
    else if (i > m) { unique = true; m = i; most_popular = s; }
}

return unique ? most_popular : "no majority"'

【讨论】:

  • for循环的条件是什么?
  • @user3371287,这是一个基于范围的 for 循环。没有明确的条件。
【解决方案2】:

将它们放在一个哈希表中,其中键是单词,值是出现次数。当您将它们放入哈希表时,请检查最大计数。

不仅您避免了 ifs,而且(最重要的是)无论数组的长度如何,它都可以工作。

【讨论】:

    【解决方案3】:

    一个简单的方法是有一个std::map&lt;std::string, int&gt;,它将每个字符串映射到它在数组中的频率。

    for (auto str : a) {
      frequencies[str]++;
    }
    

    然后,您可以随后在地图中搜索最高频率,也可以在上述循环期间跟踪迄今为止的最高频率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 2016-05-02
      • 2016-11-11
      • 2017-09-21
      • 2012-03-12
      • 2012-02-02
      相关资源
      最近更新 更多