输入长度为 n 的一个正整数序列,要求输出序列中最长连号的长度。
连号指在序列中,从小到大的连续自然数。
输入格式第一行,一个整数 n。
第二行,n 个整数 ,之间用空格隔开。
输出格式一个数,最长连号的个数。
输入输出样例输入 #1
10 1 5 6 2 3 4 5 6 8 9
输出 #1
5说明/提示
数据规模与约定
对于 100% 的数据,保证 1≤n≤,1≤≤。
我的思路:首先,判断连号,并把连号的长度存入数组,最后利用冒泡排序求最长连号
(可以看出我真的很爱用数组)
#include#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#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



