现在的位置: 首页 > 综合 > 正文

某公司笔试题

2013年09月08日 ⁄ 综合 ⁄ 共 1604字 ⁄ 字号 评论关闭

题目大致是这样。有一排紧挨着的阶梯(假设阶梯有两侧封闭),可以用来收集雨水,比如一组数据{8,4,7,2,5,9}。求出该组阶梯最大的蓄水量

每个数据代表该容器当前的高度。蓄水量用高度表示

比如{8,4,7,2,5,9},4这个可以蓄水(8-4),7可以蓄水(8-7),2可以蓄水(8-2),5可以蓄水(8-5)

当时少考虑了一种情况是,不仅该数比两边的数小情况下可以蓄水,而且该数的左边只要有比该数大的,该数的右边只要有比该数大的便可以蓄水

(可以隔着,不连续的,这种情形当初就没有考虑到)

题目描述的不是很好。

先找到该序列中最大的数所在的索引即为max_index,然后在该索引往右找右边部分最大的数的索引r_index,然后先把max_index与r_index之间可以收集的雨水量相加。

更新index为r_index继续往右扫,找到index右边区间最大的索引还是记为r_index,把index与r_index之间的能收集的雨量相加,直至r_index超过数组上限。

max_index左边的操作与右边的操作类似, 用变量index存储max_index左边一直扫描找到左边区间最大的数的索引l_index,l_index与index之间可以收集的雨量进行相加。

更新index为l_index,index往左区间找到最大的数记为l_index,继续增加index与l_index之间的雨量。继续这个操作,直至l_index超过数组下限。

第一次寻找最大的需n次,最坏情形下最大元素右边区间(设右边区间数列长度为x)是个递减数列,右边的需寻找最大的依次为x-1,x-2,...1

(x-1)*x/2;

最大元素左边最坏情形是个递增数列,(长度为n-x-1)。左边需比较次数为(n-x-2),(n-x-3),..1

#include<iostream>
using namespace std;
int amount(int *A,int low,int high){
	int max_index=low;
	int max_elem=A[low];
	int r_max; //max element value 
	int r_index;//max element index in the subsection
	int l_max; //value of the max element  in the subsection
	int l_index;//max element index in the subsection
	int index;//max element index in the section
	int res=0;
	for(int i=low;i<=high;i++){
		if(A[i]>max_elem){
			max_elem=A[i];
			max_index=i;
		}
	}
	r_index=max_index+1;
	index=max_index;
	l_index=max_index-1;
	while(r_index<=high){
		r_max=A[r_index];
		for(int i=r_index;i<=high;i++){
			if(A[i]>r_max){
				r_index=i;
				r_max=A[i];
			}
		}
		for(int j=index+1;j<r_index;j++)
			res+=r_max-A[j];
		index=r_index;
		r_index++;
	}
	while(l_index>=low){
		l_max=A[l_index];
		for(int i=l_index;i>=low;i--){
			if(A[i]>l_max){
				l_max=A[i];
				l_index=i;
			}
		}
		for(int j=l_index+1;j<index;j++)
			res+=l_max-A[j];
		index=l_index;
		l_index--;
	}
	return res;
}
int main(){
	int A[]={8,7,5,4,3,6};
	cout<<amount(A,0,5);
}

抱歉!评论已关闭.