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

#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;
}

最佳答案

您的代码的其他部分是错误的,因为它将在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;
}


假设数组按升序排列。

但是,如果要存储最小值或最大值或平均值,则可以不使用向量来执行此操作。


如果横向计数与旧计数相同,则至少在横向上不更改模式
对于最大值,您将为相同的计数分配新值
对于平均值,只需添加所有数字,但跟踪添加的数字。然后在循环结束时只需avg = sum / no. of element


因此,在所有三种情况下,都不要求vector。

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

10-14 10:55
查看更多