我的程序假设计算我的数组中的数据从增加变为减少的次数,反之亦然。例如:{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;
答案 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;
}
答案 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);
}