xxxxxxxxxxx
# -*- coding: cp936 -*-
'''
等值首尾和
假设有一个数组x[],它有n个元素,每一个都大于零;
称x[0]+x[1]+…+x[i]为前置和(Prefix Sum),
而 x[j]+xlj+1]+…+x[n-1]为后置和(Suffix Sum)。
试编写一个程序,求出 x[]中有多少组相同的前置和与后置和。
【说明】
如果x[]的元素是3,6,2,1,4,5,2,于是x[]的前置和有以下7个,
即3,9,11,12, 16,21,23;后置和则是2,7,11,12,14,20,23;
于是11、12与23这3对就是值相同的前置和与后置和, 因为:
11=3+6+2 (前置和)=2+5+4 (后置和)
12=3+6+2+1 (前置和)=2+5+4+1 (后置和)
由于23是整个数组元素的和,因此前置和与后置和一定相同。
当然,也可以用上面的方法把前置和与后置和都先算出来
(两者都是从小到大的递增 序列,为什么?),再进行比较,
但建议不要使用这种方法,因为它需要额外的内存。
'''
def ComputCountSumOfHeadOrTail(listX):
if len(listX)<0:
return -1
indexHead=0
indexTail=len(listX) - 1
sumOfHead=0
sumOfTail=0
count=0
while( indexHead<len(listX) and indexTail > 0):
if sumOfHead>sumOfTail:
sumOfTail+=listX[indexTail]
elif sumOfHead<sumOfTail:
sumOfHead+=listX[indexHead]
else:
count+=1
indexHead+=1
print "x[]中有%d组相同的前置和与后置和" %(count)
ComputCountSumOfHeadOrTail([3,6,2,1,4,5,2])
xxxxxxxxx
另附c++源码
xxxxxxxxxx
int head_tail(int x[], int n){
int prefix = 0, suffix = 0;
int prefix_idx = 0, suffix_idx = n-1;
int count = 0;
while (suffix_idx >= 0 && prefix_idx <= n-1)
if (prefix < suffix) /* prefix too small */
prefix += x[prefix_idx++];
else if (prefix > suffix) /* suffix too small */
suffix += x[suffix_idx--];
else { /* get an equal pair: */
count++; /* increase count and */
prefix += x[prefix_idx++]; /* advance pref.*/
suffix += x[suffix_idx--]; /* and suffix */
}
return count;
}

被折叠的 条评论
为什么被折叠?



