【问题描述】
输入一组无序的整数(整数都大于等于0),编程求出其中最长的连续升序子序列(该序列中后一个整数比前一个整数多1,序列的长度是指序列中整数的个数,长度应大于等于2)。例如输入13个整数:3520 0 3 89 56 88 3521 9 90 1 99 2 87,其中连续升序子序列有3个:3520 3521,0 1 2 3和87 88 89 90,长度分别为2、4、4,所以后两个子序列都是最长的连续升序子序列。
【输入形式】
先从标准输入读入整数的个数(大于等于1,小于等于100),然后在下一行输入这些整数,各整数之间以一个空格分隔。
【输出形式】
先向标准输出输出最长连续升序子序列的长度,然后从下一行开始按升序分行输出最长连续升序子序列,各整数之间以一个空格分隔,每行最后一个整数后也要有一个空格。
若没有连续升序子序列,直接输出数字0。
【样例输入】
13
3520 0 3 89 56 88 3521 9 90 1 99 2 87
【样例输出】
4
0 1 2 3
87 88 89 90
思路是将输入的a数组从小到大排序,再创建b数组来记录a数组的连续升序子串的长度,从b数组找到最大的数就是最长升序子串的长度
比如排列后a数组的前五位为0 1 2 3 9
对应相同下标 i 的b数组为 1 2 3 4 1
9不属于连续升序子串,所以子串长度又变成了1
我们可以在 b的数组中找出最大值,就是最长升序子串的长度,可以有多个最大值
我们输出子串时,找到 b 中最大值的下标,此时,对应的下标的a数组中的元素,就是升序连续子串中最大的那个值。
#include<stdio.h>
int main()
{
int a[30],i,j,k,n;
int b[30],max,len=1;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)//排序从大到小
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
}
for(i=0;i<n;i++)//利用b数组记录连续升序子串的长度
{
b[i]=len;
if(a[i+1]-a[i]==1)
{
len++;
}
else{
len=1;
}
}
for(i=0;i<n;i++)//找出b数组中的最大值
{
if(b[i]>max)
max=b[i];
}
printf("%d\n",max);//输出连续升序子串的最大长度
for(i=0;i<n;i++)
{
if(b[i]==max)
{
int t;
for(t=i-max+1;t<=i;t++)
{
printf("%d ",a[t]);
}
printf("\n");
}
}
}