有N个正整数组成的一个序列
给定一个整数sum
求长度最长的的连续子序列使他们的和等于sum
返回次子序列的长度
如果没有满足要求的序列 返回-1
案例1:
输入
1,2,3,4,2
6
输出
3
解析:1,2,3和4,2两个序列均能满足要求
所以最长的连续序列为1,2,3 因此结果为3
示例2:
输入
1,2,3,4,2
20
输出
-1
解释:没有满足要求的子序列,返回-1
备注: 输入序列仅由数字和英文逗号构成
数字之间采用英文逗号分割
序列长度 1<=N<=200
输入序列不考虑异常情况
由题目保证输入序列满足要求
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
void PrintList(int *list, int n)
{
for (int i = 0; i < n; i++) {
printf("%d ", list[i]);
}
printf("\n");
}
typedef struct {
int subData;
int left;
int right;
} SubList;
int GetMaxList(int *list, int len, int sum)
{
int i;
int sub = 0;
SubList arr[1000] = {0};
for (i = 0; i < len - 1; i++) {
arr[i].subData = list[i + 1] - list[i];
arr[i].left = list[i];
arr[i].right = list[i + 1];
}
for (i = 0; i < len - 1; i++) {
printf("%d ", arr[i]);
}
printf("\n");
int sumTmp = 0;
int maxLen = 0;
int count = 1;
sumTmp = arr[0].left;
for (i = 0; i < len - 2; i++) {
if (arr[i].subData == arr[i + 1].subData) {
sumTmp += arr[i].right;
count++;
if (sumTmp == sum) {
if (maxLen < count) {
maxLen = count;
}
count = 1;
}
} else {
if (sumTmp == sum) {
if (maxLen < count) {
maxLen = count;
}
}
count = 1;
sumTmp = arr[i + 1].left;
}
}
printf("maxLen:%d\n", maxLen);
}
int main()
{
char s[1000] = {0};
int sum;
int list[1000] = {0};
int pos = 0;
gets(s);
scanf("%d", &sum);
char *p = strtok(s, ",");
while (p != NULL) {
list[pos] = atoi(p);
pos++;
p = strtok(NULL, ",");
}
// PrintList(list, pos);
GetMaxList(list, pos, sum);
return 0;
}