【题】
等值数列段
如果一个数列中的某一段(至少有两个元素)的各元素值均相同,则称之为等值数列段。等值数列段中元素的个数叫做等值数列段的长度。
输入:
由N个元素组成的整数数列A(其中N<=50)
输出:
A中长度最大的所有等值数列段的始末位置,如果没有等值数列段,则输出No equal number list.
说明:
始末位置是指数组下标,即0表示第一个元素。
如果有多个同等长度的等值数列,只输出第一个等值数列的起始位置。
当在一个LIST中出现两个等长的连续串的时候,我们的答案应该是第一个等长串。
| 测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 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;
}