求解最长平台
初学算法,逻辑思维不好,见笑了。题目是 c语言名题精选百则上面第一个题,思考完善了一天多,没有达到最精简的要求,并且还有一处bug。
编程思想(类似冒泡排序的思维,通过数组把相同的元素和次数进行了记录)
通过 两层循环的嵌套 和 if 语句判断 下一个元素是否和当前元素相等
外层循环相当于下面每个图片间的变换
内层循环相当于单幅图片内用笔画的线
相等 —— 标志位 + 1 ,并记录该 元素
不相等—— break,进入外层循环 +1
代码
**//改进,sign赋初值为 1
#include <stdio.h>
int main()
{
int a[10]; //存放输入的数
int sign[10]={0}, num[10]={0}; //作为记录 重复次数 和 对应的元素
int i, j; //循环计数
int max, maxnum; //用来最后比较输出最大的长度 和 对应的元素
for(i=0;i < 10;i++) //此循环用来给 sign[10] 赋初值 全为 1
{
sign[i]=1;
}
for(i=0;i < 10;i++) //此循环用来让用户输入一个十个数的数组
{
printf("a[%d]=", i);
scanf("%d", &a[i]);
}
for(i = 0; i < 10; i ++) //外层循环 ,作用上面图片介绍
{
for(j = i; j < 10; j ++) //内层
{
if(a[i] == a[j + 1]) // 如果 当前 元素的 下一个还和它相等 标志位 + 1 ,并记录这个元素
{
sign[i] = sign[i]+1;
num[i] = a[i];
}
else //不相等,将 累计相等的个数 j 赋值给 i 实现跳跃相同的数 ,退出内层循环
{
i = j;
break;
}
}
}
for (i = 0; i < 10; i ++) // 打印原始数组
{
printf("a[%d]= %d ",i, a[i]);
}
printf("\n");
//上面得到了一个标志位数组 sign[10] ,里面存储了元素重复出现的个数
max = sign[0]; // 比较sign[10]里面的数字,找出最大的,就是最长平台
maxnum = 0;
for (i = 0; i < 10; i ++)
{
if(sign[i] > max)
{
max = sign [i];
maxnum = i;
}
}
printf("sign[%d]=%d num[%d]=%d ", maxnum, max, maxnum, num[maxnum]);
printf("\n"); //输出,为什么只对比标志位就能打印出最长平台相应的元素?-得益于 sign[i] 和 num[i] 的统一
}**
//没有使用比较后只输出最大的平台时的结果(max = sign[0];之后的注释掉)
// sign[1]=2 num[1]=2 sign[3]=3 num[3]=3 sign[7]=2 num[7]=5
// Press any key to continue
// 2(num) 出现了 2(sign)次
// 3 出现了 3次
// 5 出现了 2次
BUG
//输入
a[0]=1
a[1]=1
a[2]=2
a[3]=2
a[4]=3
a[5]=3
a[6]=4
a[7]=4
a[8]=5
a[9]=5
//重新打印数组
a[0]= 1 a[1]= 1 a[2]= 2 a[3]= 2 a[4]= 3 a[5]= 3 a[6]= 4 a[7]= 4 a[8]= 5 a[9]= 5
//结果
sign[0]=2 num[0]=1
Press any key to continue