常见笔试题一

来源:互联网 发布:淘宝家具安装工挣钱 编辑:程序博客网 时间:2024/05/22 01:44
1、问题:
给你一个int数组,长度为n,数组中存放的是一支股票n天来的价格,请求出在哪天买入,哪天卖出的利润最大,注意只能买卖一次。 
解题思路:
采取分段处理的思想。首先将购买日期nBuyTemp和卖出日期nSellTemp都初始化为第一天,在遍历数组arr的过程中,如果arr[i]大于arr[nSellTemp],那么将nSellTemp的值设置为i。如果遇到arr[I]小于arr[nBuyTemp],此时说明要开始一个新的处理分段。记录下前一个分段中nSellPrice域nBuyPrice的差值,用于与后面的分段的差值比较。
当数组是个递减数列时,就有可能出现nBuyTemp走到nSellTemp的前面,因此每次需要对这种情况进行判断。
代码中的循环次数为Len+1次,因为要处理遍历了最后一个元素后是否需要修改分段的起始位置。
解法:
<pre name="code" class="cpp">#include <stdio.h>void Decide(int* arr,const int Len,int& nBuy,int& nSell){int i = 0;int nTemp;int nBuyTemp;// 暂时的购买日期int nSellTemp;//暂时的出售日期int ans = 0;//购买差价int nBuyPrice = arr[i];//当前购买价格nBuyTemp = 0;int nSellPrice = arr[i];//当前出售价格nSellTemp = 0;i += 1;ans = nSellPrice - nBuyPrice;//当前差价for(;i<=Len;i++){nTemp = nBuyTemp;//?if(i<Len){if(arr[i]<=nBuyPrice){if((arr[nSellTemp]-arr[nBuyTemp])>ans){nBuy = nBuyTemp;nSell = nSellTemp;ans = arr[nSellTemp]-arr[nBuyTemp];nBuyPrice = nSellPrice = arr[i];}else{nBuyTemp = i;nSellTemp = i;nBuyPrice = nSellPrice = arr[i];}}if(nBuyPrice >= arr[i]){nBuyPrice = arr[i];nBuyTemp = i;}if(nSellPrice <= arr[i]){nSellTemp = i;nSellPrice = arr[i];}if(nBuyTemp > nSellTemp)nBuyTemp = nTemp;}else{if((arr[nSellTemp]-arr[nBuyTemp])>ans)//考虑数组最后一段{nBuy = nBuyTemp;nSell = nSellTemp;}}}}int main(){printf("***********Write by cb827461712************\n");int nBuy = 0;int nSell = 0;//int arr[10] = {1,3,4,2,1,5,6,8,5,3};//int arr[10] = {1,2,3,4,5,6,7,8,9,10};int arr[] = {2,1,4};//int arr[10] = {10,9,8,7,6,5,4,3,2,1};//int arr[8] = {2,3,6,4,9,0,9,10};Decide(arr,3,nBuy,nSell);printf("%d %d\n",nBuy,nSell);return 0;}

分析:时间复杂度O(n)
运行结果:

另一道类似的题见常见笔试题二
0 0
原创粉丝点击