我试图编写一个接受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++;}
}
}
}
答案 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