C ++计算数组中数据变化的次数改变了方向?

时间:2015-09-04 07:32:43

标签: c++ loops for-loop

我的程序假设计算我的数组中的数据从增加变为减少的次数,反之亦然。例如:{1,2,3,4,3,4} 当前四个元素增加然后减少o 3(导致一个变化)然后增加到四个导致第二个变化时,变化两次。 我的代码中的想法是,每当更大或减少变为false时,它会计算它何时发生但我无法使其工作。 非常感谢任何帮助,因为我真的很挣扎!

unsigned count = 0;
bool greater = true;
bool decrease = true;
for (unsigned i = 0; i < elements; i++){
    if (a[i + 1] > a[i]){
        greater = true;
    }
    else
        greater = false;
    count++;
}
for (unsigned i = 0; i < elements; i++){
    if (a[i + 1] < a[i]){
        decrease = true;
    }
    else
        decrease = false;
    count++;
}
        return count;

4 个答案:

答案 0 :(得分:2)

你的逻辑错了

你可以做点什么

enum class EDirection { none, decreasing, increasing};

std::size_t count_direction_changes(const std::vector<int>& v)
{
    std::size_t res = 0;
    EDirection direction = EDirection::none;

    for (std::size_t i = 1; i != v.size(); ++i) {
        const int diff = v[i] - v[i - 1];
        switch (direction)
        {
            case EDirection::none: {
                if (diff == 0) {
                    break;
                }
                direction = (diff > 0) ? EDirection::increasing : EDirection::decreasing;
                break;
            }
            case EDirection::increasing: {
                if (diff < 0) {
                    ++res;
                    direction = EDirection::decreasing;
                }
                break;
            }
            case EDirection::decreasing: {
                if (diff > 0) {
                    ++res;
                    direction = EDirection::increasing;
                }
                break;
            }
        }
    }
    return res;
}

Demo

答案 1 :(得分:1)

你必须改变你的循环。首先,你应该在size-1处停止循环。因为你正在与下一个元素进行比较,如果你的for运行到元素而不是元素-1,你可以超出界限。

此外,您有一个逻辑问题。如果您使用布尔变量作为标志,则应在增加计数器之前检查它是否为真。如果您增加计数器,则必须重置该标志。类似于下行循环的东西应该有效。也许有一些小错误,因为我现在没有任何测试。但它应该与此类似。

for (unsigned i = 0; i < elements-1; i++){
    if (a[i + 1] > a[i]){
        greater = true;
    }
    else{
        greater = false;
    }
    if(greater){
        count++;
        greater = false;
    }
 }

答案 2 :(得分:0)

这很像Jarod42的,但看到我已经编码它将把它扔出去。顺便说一句,我使用稍微笨拙的{"label":"Daughter","value":1}所以只需要实现v[n] < v[n - 1]将算法应用于用户定义的类型(即不是operator<)。

operator>

看到它运行here

答案 3 :(得分:0)

这是另一种方法,类似于托尼和贾罗德:

#include <vector>
#include <cassert>
#include <iostream>

size_t countTrendChanges(const std::vector<int>& a) {
  if (a.size() < 3)
    return 0;

  int trend = 0;
  size_t count = 0;
  for (size_t i = 1; i != a.size(); ++i) {
    int new_trend = (a[i-1] < a[i]) - (a[i] < a[i-1]);
    if (new_trend == 0)
      continue;
    if (trend != 0 && new_trend != trend)
      count++;
    trend = new_trend;
  }
  return count;
}

int main() {
 assert(countTrendChanges({}) == 0); 
 assert(countTrendChanges({1}) == 0); 
 assert(countTrendChanges({3,2,1}) == 0); 
 assert(countTrendChanges({1,2,3}) == 0); 
 assert(countTrendChanges({1,2,2,3}) == 0); 
 assert(countTrendChanges({3,2,1,2,3}) == 1); 
 assert(countTrendChanges({1,2,3,2}) == 1); 
 assert(countTrendChanges({2,1,1,2}) == 1); 
 assert(countTrendChanges({1,2,2,1}) == 1); 
 assert(countTrendChanges({1,2,3,4,3,4}) == 2); 
}