今天看到一道绿盟的面试题。感觉比较有意思,放在这里给大家分享一下。原文如下:
小王的账本:小王出门打零工,工作很不稳定,收入也很不稳定,他找了一个账本记录他每天的支出,例如:
1月1日 收入320;
1月2日 没找到工作,吃饭花了30;
1月3日 挣50;
1月4日 无工作,吃饭花了17;
1月5日 无工作,租房+吃饭花了2600;
..........
年底了,小王想知道自己账本上哪一段时间挣钱挣的最多。
设计并实现算法帮助小王得到他挣钱最多的时间段和这段时间所挣到的钱(数据条数<1000,算法时间/空间复杂度尽可能小),并给出算法的时间/空间复杂度。
--------------------------------------------------------------------------------------------------------------
刚开始看到这道题,没大明白,后来看明白了,觉得蛮有意思的。其实就是求最大连续子序列的和
/*
求最大连续子序列的和
描述:有一整数序列X,长度为N,从中连续的选出n个数使这n个数的和最大,并指出和最大时,这n个数在原序列中的下标范围
*/
#include<stdio.h>
#define N 10 //假设N为365
int main(void)
{
int i, a[N],sum;
int start, end;
printf("please input the value of N numbers\n");
for ( i = 0; i < N; i++)
{
scanf("%d", &a[i]);
}
int max = a[0];//将最大值先定义为第一个数
start = 0;//默认范围就是第一个数
end = 0;//默认范围就是第一个数
for (i = 0; i < N; i++)
{
sum = 0;
for (int j = i; j < N; j++)
{
sum += a[j];
if (max < sum)
{
max = sum;
start = i;//和最大时,开始的那个数
end = j;//和最大时,结束的那个数
}
}
}
printf("最大连续子序列的和为%d\n", max);
printf("范围为第%d---第%d个数\n", start + 1, end + 1);//从1开始数
return 0;
}
这样算的话,会有几个问题。
1:如上所示,其实1-8天和1-10天的和的结果是一样的,最后输出只输出了第一种情况。
2:如果序列中,有几个不同子序列的和都是最大的,最后也智能输出最开始的那个最大子序列。