阿里实习生笔试程序检测题目

昨天晚上偶然看到同学在做阿里实习生笔试中的程序编码检测,题目如下给定两个数组A和B,假定其中有四个元素即为:A=[a1,a2,a3,a4]  B=[b1,b2,b3,b4];
那么将B中的元素插入到A之中,可以在A数组中任意位置插入任意个。即有如下可能:
C=[a1,b1,b2,b3,b4,a2,a3,a4]; 或者C =[b1,a1,b2,b3,a2,a3,b4,a4]等可能;
然后将新数组中元素进行两两相乘并再次类和运算,输出其中和最大的一个组合。(其中1234的顺序不能改变)
题目限时为30分钟,有限时间内感觉该题目的难度确实有点大。
第一想法是暴力破解:
vector<int> MaxSum(vector<int> A,vector<int> B){
	int sum=0;
	int length=A.size();
	int i=0;
	while(i<length){
		queue<int> Aq,Bq;
		for(int j=0;i<length;i++)
			Aq.push(A[i]);
		for(int j=0;i<length;i++)
			Bq.push(B[i]);
		vector<int> C;
		for(int j=0;j<i;j++){
			int k=Aq.front();
			C.push_back(k);
			Aq.pop();
		}
		
	}
}

然后写了这么多写不下去了。。。感觉情况太过复杂难以分析,所以就鸽了,感觉用二叉树不知道会不会容易点,但是单纯的使用数组的难度有点大。递归好难啊!!!!好难插,感觉头脑太笨难以解决。
然后今天下午想了想,突然灵光一闪,是不是可以通过选择两数之间最小的数插入到一个新的链表之中,然后对数组进行求值,因为每次对比都是两个数组中最小的元素,所以这样来说相对乘积应该也是最小的一组。所以这种解法是动态规划?还是贪心?我算法基础不好啊,就是感觉能这样解来着,也不清楚到底能不能解决题目,所以附上自己编的程序,希望有大牛给点解读吧!我这题没底的,所以仅供各位做一个参考也是自己学习的记录吧:
vector<int> MaxSum(vector<int> A,vector<int> B){
	int sum=0;
	int length=A.size();
	int i=0;
	queue<int> Aq,Bq;
	for(int j=0;i<length;i++)
		Aq.push(A[i]);
	for(int j=0;i<length;i++)
		Bq.push(B[i]);
	vector<int> C;
	while(i<2*length){
		if(Aq.front()<Bq.front())
			C.push_back(Aq.front());
		else
			C.push_back(Bq.front());		
	}
	for(int k=0;k<C.size();){
		sum+=C[k]*C[k+1];
		k+=2;
	}
	return C;
}

鸽了鸽了,感觉有点难啊!30分钟并不能解出来,所以看来阿里已经离我远去了啊!
刚刚看了看好像还是有点问题,没有控制Aq和Bq两个队列弹出,所以输出肯定不对,所以又改了改:
vector<int> MaxSum(vector<int> A,vector<int> B){
	int sum=0;
	int length=A.size();
	int i=0;
	queue<int> Aq,Bq;
	for(int j=0;i<length;i++)
		Aq.push(A[i]);
	for(int j=0;i<length;i++)
		Bq.push(B[i]);
	vector<int> C;
	while(i<2*length){
		if(Aq.empty()||Bq.empty())   //添加跳出循环判断条件
			break;
		if(Aq.front()<Bq.front()){
			C.push_back(Aq.front());
			Aq.pop();
		}
		else{
			C.push_back(Bq.front());
			Aq.pop();
		}		
	}
	if(Aq.empty()){//添加对一方队列为0时的插入方式;
		while(!Bq.empty()){
			C.push_back(Bq.front());
			Bq.pop();
		}
	}
	else{
		while(!Aq.empty()){
			C.push_back(Aq.front());
			Aq.pop();
		}
	}
	for(int k=0;k<C.size();){
		sum+=C[k]*C[k+1];
		k+=2;
	}
	return C;
}
好了好了最后就是这样了,不改了,写的头疼。

猜你喜欢

转载自blog.csdn.net/u010404530/article/details/79654641