洛谷选题:P1420 最长连号

【题目】

输入长度为 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;
}
相关推荐
2401_872418782 小时前
算法入门:数据结构-堆
数据结构·算法
xwz小王子4 小时前
手术机器人登上Science Robotics:2毫米纤细手臂,从3厘米切口完成腰椎神经减压
算法·机器人
黎阳之光4 小时前
视频孪生智护供水生命线:黎阳之光赋能医疗与园区水务高质量升级
运维·物联网·算法·安全·数字孪生
Black蜡笔小新5 小时前
自动化AI算法训练服务器DLTM制造业AI质检工作站助力制造业实现AI智检
人工智能·算法·自动化
嵌入式小能手5 小时前
飞凌嵌入式ElfBoard-进程间的通信之命名管道
linux·服务器·算法
啦哈拉哈6 小时前
Leetcode题解记录-hot100(81-100)
算法·leetcode·职场和发展
csdn_aspnet6 小时前
Java 霍尔分区算法(Hoare‘s Partition Algorithm)
java·开发语言·算法
诸葛务农6 小时前
道路行驶条件下电动汽车永磁电机的有效使用寿命及永磁体的失效和回收再利用(下)
java·开发语言·算法
snow@li6 小时前
AI:理解 大数据、算法、算力、电力、生成式AI、token 之间的关系
大数据·人工智能·算法
小智老师PMP6 小时前
零基础能不能考PMP?零基础专属学习路径+全套扶持体系
学习·算法·职场和发展·软件工程·求职招聘·敏捷流程