如何在序列中找到连续的数字

时间:2015-03-25 14:33:07

标签: c++

我试图编写一个接受10个随机整数的程序,并检查序列中是否有三个连续的数字。连续的数字可以是升序或降序。 这里有一些例子可以帮助您更好地理解: 订购。例子:

2 9 8 3 20 15 9 6 4 24 是的,2 3和4是连续的

16 21 3 8 20 6 3 9 12 19 是的,21 20和19是连续的

我无法弄清楚我的代码是什么问题。 这是我目前的代码:

#include <iostream>
using namespace std;
int main()
{
int a[10];
int i,n;
int count=0;


cout << "Enter 10 numbers between 1 and 25" << endl;

for (i = 0; i < 10; i++)
{             cin >> a[i];

}


for (n=0; n<10; n++)
{
    for (i=1; i<10; i++)
    { 
        if (a[i]==a[n]+1)
        {cout<<endl<<a[i]<<endl;
        count++;}
    }

}

}

3 个答案:

答案 0 :(得分:4)

您的代码目前是O(N 2 ),要使其工作,它将是O(N 3 )。

我宁愿使用代替O(N)的算法。

假设您只关心25个值,则可以从32位字开始,并将该字中的位设置为与输入的每个数字相对应(例如word |= 1 << input_number;)。

然后取值7(设置三个连续位)并在该字中的可能位位置测试它,以查看是否在字中的任何位置设置了三个连续位。如果是这样,他们设置的位置会告诉您已找到的三个连续数字。如果没有,则输入中没有三个连续的数字。

for (int i=0; i<32-3; i++) {
    int mask = 7 << i;
    if (word & mask == mask)
        // three consecutive bits set -> input contained i, i+1 and i+2
}

答案 1 :(得分:1)

你的逻辑错了。您当前的代码所做的是它检查是否有任何两个连续的整数。要检查三个,您应该引入另一个嵌套循环。这将使时间复杂度为O(n ^ 3)。

另一种检查方法是首先对数组进行排序,然后检查连续元素。这将使运行时间为O(nlogn)。您可以使用内置的sort函数进行排序。

答案 2 :(得分:1)

算法需要重新编写。事实上,你在做的是说:

For each array element x
     See if another array element is x+1
         print out the array element that is x+1

坚持更多cout行看看发生了什么,比如

    if (a[i]==a[n]+1)
    {cout<<endl<<a[n]<<","<<a[i]<<endl;
    count++;}

可能的,虽然很慢,但算法

For each array element x
     See if another array element is x+1
          See if another array element is x+2
             print out x, x+1, and x+2