c++ - 计算模式最大值

标签 c++ arrays mode

我正在使用以下代码来计算模式

#include <iosfwd>
#include <vector>
#include <iostream>

int prices[]={1,1,2,2,2,3,3,3};

int main()
{
  double currval=prices[0];
  int ctr=1;
  int maxctr=1;
  double modval=prices[0];
  for (int i=1;i<8;i++) {
    if(prices[i]==currval) {
      ++ctr;
    }else {
      if(ctr>maxctr) {
    maxctr=ctr;
    modval=currval;
      }
      currval=prices[i];
      ctr=1;
    }
  }
 std::cout<<"mode is: "<<modval<<std::endl;
  return 0;
}

但不幸的是,这会返回第一种模式。

mode is: 2

我想继续传递数组并捕获另一个数组中的所有模式,这样我就可以选择模式数组的最大值或最小值或平均值。因此,在我的示例中,我将有一个内容为 {2,3} 的数组。 关于我如何做到这一点的任何建议。 谢谢! 编辑:

#include <iosfwd>
#include <vector>
#include <iostream>

int prices[]={1,1,2,2,2,3,3,3};
std::vector<int> result;

int main()
{
  double currval=prices[0];
  int ctr=1;
  int maxctr=1;
  double modval=prices[0];
  for (int i=1;i<8;i++) {
    if(prices[i]==currval) {
      ++ctr;
    }else {
      if(ctr>maxctr) {
    maxctr=ctr;
    result.clear();
    result.push_back(currval);
      } else {
    if (ctr==maxctr) {
      result.push_back(currval);
    }
      }
      currval=prices[i];
      ctr=1;
    }
  }
 if(ctr>maxctr) {
    maxctr=ctr;
    result.clear();
    result.push_back(currval);
      } else {
    if (ctr==maxctr) {
      result.push_back(currval);
    }
      }

  return 0;
}

最佳答案

您的代码在 else 之后的部分是错误的,因为它将在 ifelse 之后执行,这不是我们想要的。

#include <iosfwd>
#include <vector>
#include <iostream>

int prices[]={1,1,2,2,2,3,3,3};

using namespace std;

int main()
{
    int ctr=1;
    int maxctr=1;
    vector<int> allModes;
    int max, min;

    for (int i=0; i<8; i++) {

        if(prices[i+1]==prices[i]) {
            ++ctr;
        }
        else {
            if(ctr == maxctr) {
                allModes.push_back(prices[i]);  //if it is same as previous mode add it to vector
                //max = prices[i];
            }
            if(ctr > maxctr) {
                allModes.clear();           //if it is greater than previous mode then previous number is not a mode now
                                            //so clear old vector
                allModes.push_back(prices[i]);  
                maxctr = ctr;
                //max = prices[i];
                //min = prices[i];
            }
            ctr=1;
        }
    }


    std::cout<<"Mode: ";
    for (  vector<int>::iterator it=allModes.begin() ; it < allModes.end(); ++it ) {
        std::cout<< " " << *it;
    }
    return 0;
}

假设数组按升序排列。

但是如果你想存储最小值或最大值或平均值,你可以不使用 vector 来做到这一点。

  1. 对于 min 和 transverse 如果它与旧的有相同的计数则不要改变模式

  2. 对于最大值,您将为相同的计数分配新值

  3. 对于平均数,只需将所有数字相加,但要跟踪相加的数字。然后在循环结束时取 avg = sum/no。元素的

所以在所有这三种情况下,都不需要 vector 。

关于c++ - 计算模式最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8452654/

相关文章:

c++ - 关于 : Child Class in a Array C++

c++ - 在不同的范围内新建和删除

java - 如何从 int 类型的方法返回多个整数

android - 不工作-在带有平板电脑 HUAWEI MediaPad M5 的 Android Studio 上 Debug模式 native 代码 (c/c++)

c++ - 将传递引用转换为传递返回

c++ - Box2D 在不移动圆的情况下改变圆所面对的角度

ios - (非原子、强)属性的生命周期在 iOS 中如何运作?

java - 类构造函数中的 ArrayIndexOutOfBounds

java - 在 Java 中旋转 Sprite

emacs 在 nowindow 模式下将 kill-ring 复制到系统剪贴板