【题目】
输入长度为 n 的一个正整数序列,要求输出序列中最长连号的长度。
连号指在序列中,从小到大的连续自然数。
输入格式
第一行,一个整数 n。
第二行,n 个整数 ai,之间用空格隔开。
输出格式
一个数,最长连号的长度。
输入样例1:
10
1 5 6 2 3 4 5 6 8 9
输出样例2:
5
【解题思路】
依次遍历所有数据,从起始遍历点开始比较前后两个数据是否是连号,如果是则将统计个数的变量加1,否则结束本轮遍历;
更新统计最长连号个数的变量max,让max中存储的始终是当前最长的连号数据的个数;
在上一次结束遍历处继续新的一轮的遍历;
.......
直到所有数据都被遍历到,则结束循环。
注意:由于外层的循环不知道要遍历多少次,而且每一次遍历的起始编号并没有规律,都是由上一次结束遍历点决定,所以外层循环采用while更合适。
【代码】
cpp
#include <bits/stdc++.h>
using namespace std;
int main()
{
//第一步:输入一个整数n
int n;
cin>>n;
int a[n];
int max=0;//存储最大的连号数据个数
//第二步:输入n个数
for(int i=0;i<n;i++)
cin>>a[i];
int i=0;//从第一个数开始遍历数组中的所有数
//由于i的变化是无规律的,每一次遍历的起始编号,由上一次结束遍历的位置决定,所以选用while遍历
while(1)
{
int cnt=1;//存储每一次连号的数据个数,因为至少有一个数据,所以cnt起始值为1
int j=i+1;//需要比较的两个数的后面一个数据的编号
for(;j<n;j++)//希望能够遍历到最后,所以j的变化结束值为n-1
//第三步:比较相邻的连个数据是否是连号
if(a[j]==a[j-1]+1)
cnt++;
else//如果不连号,则结束本次遍历
break;
//第四步:更新max
if(cnt>max)
max=cnt;
//第五步:是否遍历完所有数据,如果已经遍历到最后一个数据,则跳出while循环
if(j==n)
break;
else//负责继续下次新的遍历,从结束遍历点j开始遍历。
i=j;
}
//第六步:输出最长的连号个数。
cout<<max;
return 0;
}