在序列中查找相似的数字并记录最大连续条纹

时间:2017-10-08 01:47:53

标签: c++ algorithm math

我有一长串数字,我想在列表中记录最长的连续数字。

每次数字与前一个数字相差10或更小时,我想增加一个计数器。例如:

1
53
32
74
74
75
75
74
98
2
2
4
3
2
3
1
3
2

74,74,75,75,74将被计算在内,因为彼此之间的距离不到10个。所以这将是5连胜。之后有98和甚至更长的连胜。所以,由于时间较长,计数器需要抛弃之前的连胜,因为它并不是最大的连胜。它基本上重置了。

list of numbers i'm working with: https://pastebin.com/aga6kkq2

这是我目前的代码:

vector<int> numbers;
for (int i = 0; i < numbers.size() - 1; i += 2)
    {
        cout << numbers[i] << " first set \n" << numbers[i + 1] << " second set " << endl;
        int b = numbers[i];
        int a = numbers[i + 1];
        int difference = b - a;
        if (difference <= 10)
        {
            count++;
            if (difference > 10) {
                break;
            }
        }
    }

这将得到第一对数字并减去差异,看它是否小于10.我确信这是一种更好的方法。它不准确,并且关闭4.此列表中最长的连续条纹应为140.实现此目的的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

vector<int> numbers;

// some code here to add values to the numbers array

int maxStreak = 0;
int counter = 0;
int previousNumber;
int currentNumber;
for (int i= 1; i < numbers.size(); i++)
{
    previousNumber = numbers[i - 1];
    currentNumber = numbers[i];

    if (abs(currentNumber - previousNumber) <= 10) {
        counter++;
        maxStreak = (counter > maxStreak) ? counter : maxStreak;
    }
    else {
        counter = 0;
    }
}
cout << maxStreak;

以下是它的工作原理:

  1. maxStreak 存储最多的条纹。
  2. 计数器存储当前条纹的数量。
  3. 循环开始从数组的第二个元素读取,并将数组中的每个数字与之前的数字进行比较。
  4. 如果两个数字之间的差异等于或小于10,则计数器会递增,而 maxStreak 将会相应更新。
  5. 如果两个数字之间的差异不等于或小于10,计数器将重置为0.

答案 1 :(得分:0)

记住潜在运行的start索引(最初为0)

从第二个索引开始循环并检查每个(i++)

计算A[i]A[i-1]的差异(AD)的绝对

如果AD 太大,则运行结束,因此查找运行长度(i-start)是否比之前的长度maxlen

更长

再次检查循环结束后的运行长度