【数列】等值数列段

【数列】等值数列段

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

输入:

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

输出:

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

说明

始末位置是指数组下标,即0表示第一个元素。
如果有多个同等长度的等值数列,只输出第一个等值数列的起始位置

样例:

序号测试输入期待的输出额外进程
15↵
1 2 3 4 5↵
No equal number list.↵0
26↵
1 0 1 1 1 0↵
The longest equal number list is from 2 to 4.↵0
310↵
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");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值