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

Posted

技术标签:

【中文标题】在一个序列中找到相似的数字并记录最大连续条纹【英文标题】:Find similar numbers in a sequence and record the max consecutive streak 【发布时间】:2017-10-08 01:47:52 【问题描述】:

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

每当一个数字与前一个数字相差 10 或小于 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。实现此目标的正确方法是什么?

【问题讨论】:

您的具体问题是什么? “请为我编写一个更好的代码版本”不是问题。 @Sam Varshavchik 如何在序列中找到相似的数字并记录最大连续条纹?它在标题中。我尝试的方式显然不起作用,这就是我在这里的原因! 嗯,这样做的方法是打开一个文本编辑器,然后编写一些 C++ 代码来执行此操作。这就是您问题的准确答案。 这很酷。无论如何,我的代码不起作用,我的问题仍未得到解答。我来这里不是为了被拥有 50k+ 代表的人拖钓。 【参考方案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;

这是它的工作原理:

    maxStreak 存储最大的连拍数。 counter 存储当前连续的次数。 循环从数组的第二个元素开始读取,并将数组中的每个数字与其前一个数字进行比较。 如果两个数字之间的差值等于或小于 10,counter 会递增,并且 maxStreak 会相应更新。 如果两个数字之差不等于或小于 10,counter 将被重置为 0。

【讨论】:

高尔夫!高尔夫球!高尔夫!【参考方案2】:

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

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

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

如果AD太大,run就结束了,所以找run length (i-start)是否比之前的长(maxlen

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

【讨论】:

你能用一些代码更新答案以帮助我更好地理解它吗?如果我使用 i++,数字会重复,所以我使用 i += 2, 你必须明白一个逻辑。在序列 1,2,3 中,您必须同时比较 (1 和 2) 和 (2 和 3) 但是如果没有您显示代码,我真的无法确定如何做到这一点。我试过你说的,它没有用,因为我可能没有正确理解它。你能用代码展示这个例子吗?

以上是关于在一个序列中找到相似的数字并记录最大连续条纹的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 clickhouse 中记录连续的时间戳条纹

最长连续序列

查找连续序列并建议序列中的下一个数字

LeetCode -- 最大连续乘积子序列

leetcode刷题18

基础练习线性DPcodevs2622 数字序列(最大连续子序列和)题解