金山(Kingsoft)笔试面试题整理之001

题目1:有一个int型数组Num,里面存放着若干的正数和负数,请你设计一个算法,在数组中截取一段Num[start]--Num[end],使得这一段的整数之和最大,并返回最大值max。

/**************************************************/
/*有一个int型数组A[],里面存放着若干的正数和负数,请你设计一个算法, 
  在数组中截取一段A[start]--A[end],使得这一段的整数之和最大,
  并返回最大值max。
*/
/**************************************************/
#include 

/*计算数组A中在start和end下标之间的整数的和*/
int sum(int A[], int start, int end) {
	int sum = 0;
	int i;
	for (i = start; i <= end; i++ ) {
		sum += A[i];
	}
	return sum;
}

/*求数组A的最大子数组,并返回其最大子数组的最大值,数组A的长度是N。*/
/*用的暴力求解法,时间复杂度是n^2.依次计算A[i...j]的和,i=0...N-1, j=i...N-1.*/
int findMaxSubArray(int A[], int N) {
	int max = A[0], s;
	int i, j;
	for (i = 0; i < N; i++) {
		if (A[i] <= 0) continue;
		for (j = i; j < N; j++) {
			s = sum(A, i, j);
			if (max < s) {
				max = s;
			}
		}
	}
	return max;
}

int main(void)
{
	int A[7] = {-1, 3, -3, 8, 0, -9, 1};
	int r = findMaxSubArray(A, 7);
	printf("max=%d\n", r);
	return 0;
}

你可能感兴趣的:(IT笔试面试题,面试,金山,算法)