等值数列段

【题】

等值数列段


如果一个数列中的某一段(至少有两个元素)的各元素值均相同,则称之为等值数列段。等值数列段中元素的个数叫做等值数列段的长度。

输入:
        由N个元素组成的整数数列A(其中N<=50)

输出:
        A中长度最大的所有等值数列段的始末位置,如果没有等值数列段,则输出No equal number list.

说明:
        始末位置是指数组下标,即0表示第一个元素。
        如果有多个同等长度的等值数列,只输出第一个等值数列的起始位置。
        当在一个LIST中出现两个等长的连续串的时候,我们的答案应该是第一个等长串。


测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 5↵
  2. 1 2 3 4 5↵
以文本方式显示
  1. No equal number list.↵
1秒 64M 0
测试用例 2 以文本方式显示
  1. 6↵
  2. 1 0 1 1 1 0↵
以文本方式显示
  1. The longest equal number list is from 2 to 4.↵
1秒 64M 0

【分析】
声明两个数组,一个是int arr_ src[100](source,“源”的意思)用来存原始的输入数据;另一个是int arr_res(result,"结果"的意思),用来存等值数列段的最大长度。
如arr_src[i] = n;表示输入的第i+1个数是n(数组是从0开始的)。
如arr_res[j] = m,表示对于数组arr_src[0] ~ arr_src[j]之间的数,等值数列段的最大长度为m。

步骤:
1、输入。
2、初始化arr_res[0] = 1;
3、做一个循环,从第2个数开始,即arr_src[1]开始,依次扫描arr_src中的值,
如果arr_src[i] == arr_src[i-1],那么长度在原来的基础上+1,arr_res[i] = arr_res[i-1] + 1;
如果arr_src[i] != arr_src[i-1],那么长度置1,arr_res[i] = 1;
4、上面的循环完成后,数组arr_res中的最大值就是最长的等指数列段。
做一个循环, 找出最大值

例如:arr_src中存储{1,0,0,1,1,1,0,1,1,0}
则arr_res中的结果就是{1,1,2,1,2,3,1,2,1},最大值为3。

5、那如何求“长度最大的所有等值数列段的始末位置”呢???
 从arr_res的特点可以发现圈出的部分是从1开始递增到最大值的,
设最大长度为m,m对应的角标是n,那么等值数列段的起始位置就是n-(m-1);末尾位置就是m;
【代码】
只贴出输入部分:


完整代码:

#include "stdio.h"

int main(int argc, char **argv)
{
	int n, i, arr_src[100] = {0}, max= 0, arr_res[100] = {1};
	scanf("%d", &n);
	getchar();
	for(i = 0; i < n; i++)
	{
		scanf("%d", &arr_src[i]);
		getchar();
		if (i > 0)
		{
			if(arr_src[i] == arr_src[i-1])
			{
				arr_res[i] = arr_res[i-1] + 1;
			}
			else if(arr_src[i] != arr_src[i-1])
			{
				arr_res[i] = 1;
			}
		}    	
	}
	int start, end;

	for(i = 0; i < n; i++)
	{
		if(arr_res[i] > max)
		{
			max = arr_res[i];
			end = i;
		}
	}
	start = end - (max - 1);
	if(max > 1)
		printf("The longest equal number list is from %d to %d.\n", start, end);
	else 
		printf("No equal number list.\n");

	return 0;
}


  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值