北理工48.【数列】等值数列段

48.【数列】等值数列段

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

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

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

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

  测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 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
测试用例 3 以文本方式显示
  1. 10↵
  2. 1 1 1 0 1 1 1 1 1 1↵
以文本方式显示
  1. The longest equal number list is from 4 to 9.↵
1秒 64M 0
测试用例 4 以文本方式显示
  1. 10↵
  2. 1 4 4 4 5 6 6 6 5 6↵
以文本方式显示
  1. The longest equal number list is from 1 to 3.↵
1秒 64M 0

 

这道题普普通通,不作解释

#include <stdio.h>
int max_index(int arr[], int n);
int main(void) 
{
    /*首先读入数据,list[50]
    * 然后判断等值段,新建数组len[50],将每个等值段与list对应,标记等值段的长度
    * 比如:list[] ={1,1,2,2,2,3,4,5},len[]={1,2,1,2,3,1,1,1}
    * len中的数字标志其在list中连续出现的次数
    * end就是len中最大数字对应的len中的序列。例如,len[4] = 3;end = 4;4是来自len[4]
    * start = end - len[end] + 1
    */
    int n;
    scanf("%d", &n);
    int list[50] = { 0 };
    for (int i = 0; i < n; i++) scanf("%d", &list[i]);
    int len[50] = { [0] = 1 };
    for (int i = 1; i < n; i++) 
        if (list[i] == list[i - 1]) {
            len[i] = len[i - 1] + 1;
        }
        else
            len[i] = 1;
    int end = max_index(len, n);
    int start = end - len[end] + 1;
    if (end - start > 0) printf("The longest equal number list is from %d to %d.\n", start, end);
    else printf("No equal number list.\n");
    return 0;
}
int max_index(int arr[], int n)
{
    int max = 0;
    for (int i = 1; i < n; i++)
        max = (arr[i]>arr[i-1] && arr[i]>arr[max]) ? i : max;
    return max;
}

 

失策了,在网上看到巧妙解法,可以只使用一个数组

#include <stdio.h>
int main(void) 
{
    /*only one array was used*/
    int n,list[50] = { 0 },start=0,end=0,i=0,j=0;    
    scanf("%d", &n);
    for (i = 0; i < 50; i++) list[i] = -1;
    for (int i = 0; i < n; i++) scanf("%d", &list[i]);    
    for (; j < n; j++) {
        while (list[i] == list[j]) j++;
        if (end - start+1 < j - i) start = i, end = j < n ? j - 1 : n - 1;
        i = j;
    }   
    if (end - start > 0) printf("The longest equal number list is from %d to %d.\n", start, end);
    else printf("No equal number list.\n");
    return 0;
}

 

posted @ 2022-12-14 20:32  我千五可以  阅读(133)  评论(0)    收藏  举报