题目描述
输入长度为 n 的一个正整数序列,要求输出序列中最长连号的长度。
连号指在序列中,从小到大的连续自然数。
输入格式
第一行,一个整数 n。
第二行,n 个整数 ,之间用空格隔开。
输出格式
一个数,最长连号的个数。
输入输出样例
输入 #1
10 1 5 6 2 3 4 5 6 8 9
输出 #1
5
说明/提示
数据规模与约定
对于 100% 的数据,保证 1≤n≤,1≤
≤
。
我的思路:
首先,判断连号,并把连号的长度存入数组,最后利用冒泡排序求最长连号
(可以看出我真的很爱用数组)
#include<stdio.h>
#define N 10000
int a[N];
int arr[N];
int judge(int a[N],int length)
{
int i,j,k,cnt;
cnt = 1;
k = 0;
for(i = 0;i < length;i ++)
{
j = a[i+1] - a[i];
if(j == 1)
{
cnt++;
}else{
arr[k++] = cnt;
cnt = 1;
}
}
return k;
}
int main()
{
int n,i,j,tmp,length;
scanf("%d",&n);
for(i = 0;i < n;i ++)
{
scanf("%d",a+i);
}
length = judge(a,n);
for(i = 0;i < length - 1;i ++)
{
for(j = 0;j < length - i - 1;j ++)
{
if(arr[j] < arr[j+1])
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
printf("%d",arr[0]);
return 0;
}
提交之后,看了下别人的答案,不需要 另设arr数组和冒泡排序,只使用 max 就可以
(救命,我永远记不住可以用 max)
改进:
#include<stdio.h>
#define N 10000
int judge(int a[N],int length)
{
int i,j,cnt,max;
cnt = 1;
max = 0;
for(i = 0;i < length;i ++)
{
j = a[i+1] - a[i];
if(j == 1)
{
cnt++;
}else{
if(max < cnt)
max = cnt;
cnt = 1;
}
}
return max;
}
int main()
{
int n,i,a[N];
scanf("%d",&n);
for(i = 0;i < n;i ++)
{
scanf("%d",a+i);
}
printf("%d",judge(a,n));
return 0;
}
简单好多!!
收获:
在判断最大最小值的时候, 除了使用数组和冒泡排序,也可以通过 if 语句使用 max,min
这是第二次遇到这种题了,我还是用了数组T_T 希望下次可以想到用max,min