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

浙公网安备 33010602011771号