【数列】等值数列段
如果一个数列中的某一段(至少有两个元素)的各元素值均相同,则称之为等值数列段。等值数列段中元素的个数叫做等值数列段的长度。
输入:
由N个元素组成的整数数列A(其中N<=50)
输出:
A中长度最大的所有等值数列段的始末位置,如果没有等值数列段,则输出No equal number list.
说明
始末位置是指数组下标,即0表示第一个元素。
如果有多个同等长度的等值数列,只输出第一个等值数列的起始位置。
样例:
序号 | 测试输入 | 期待的输出 | 额外进程 |
---|---|---|---|
1 | 5↵ 1 2 3 4 5↵ | No equal number list.↵ | 0 |
2 | 6↵ 1 0 1 1 1 0↵ | The longest equal number list is from 2 to 4.↵ | 0 |
3 | 10↵ 1 1 1 0 1 1 1 1 1 1↵ | The longest equal number list is from 4 to 9.↵ | 0 |
思路
数组问题肯定要用循环啦
要求最长等值数列段,我们当然可以把所有等值数列段都求出来,再比较长度
代码
#include <stdio.h>
int main()
{
int n, i, ori[50] = { 0 }, max = 0, length[50] = { 1 };
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &ori[i]);
if (i > 0)
{
if (ori[i] == ori[i - 1])
{
length[i] = length[i - 1] + 1;
}
else if (ori[i] != ori[i - 1])
{
length[i] = 1;
}
}
}
int start, end;
for (i = 0; i < n; i++)
{
if (length[i] > max)
{
max = length[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;
}
双指针
数列段的题目,使用双指针算法也是完全ok的
#include <stdio.h>
int main()
{
int n, i = 0, j = 0, a[55], r = 0, l = 0;
scanf("%d",&n);
for(int i = 0;i < n;i ++) scanf("%d",&a[i]);
while(j < n)
{
while(a[i] == a[j]) j ++;
if(r - l + 1 < j - i) l = i, r = j < n ? j - 1 : n - 1;
i = j;
}
if(r != l) printf("The longest equal number list is from %d to %d.\n",l,r);
else printf("No equal number list.\n");
}