求解最长平台

求解最长平台

初学算法,逻辑思维不好,见笑了。题目是 c语言名题精选百则上面第一个题,思考完善了一天多,没有达到最精简的要求,并且还有一处bug。

编程思想(类似冒泡排序的思维,通过数组把相同的元素和次数进行了记录)

通过 两层循环的嵌套 和 if 语句判断 下一个元素是否和当前元素相等

外层循环相当于下面每个图片间的变换
内层循环相当于单幅图片内用笔画的线

相等 —— 标志位 + 1 ,并记录该 元素
不相等—— break,进入外层循环 +1
外层 循环 i= 0

外层 循环 i= 1
外层 循环 i= 3(为什么i 会跳,详解看程序)
外层 循环 i= 6
外层 循环 i= 7外层 循环 i= 9

代码

**//改进,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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值