一道小米的笔试题

题目描述:

风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。

给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 

假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 

设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<=100,0<=prices[i]<=100  

示例1 

输入  3,8,5,1,7,8  

输出  12 


看这道题时我的目标是只扫描数组一次。下面是思路和代码:

2个int(imin ,imax)保存极小值和极大值的下标,3个int:aEarn,bEarn保存两次交易赚的钱,tEarn暂时保存本次交易赚的钱之后放入aEarn,bEarn或舍弃。

一个循环得到极小值下标,一个循环得到极大值下标。

最终数组只扫描一次。


#include <stdio.h>

int main ()
{
    int p[10];
    int i;
    int sum;


    for (i = 0; i < 10; i++) {
        p[i]=10-i;
    }
    for(i=0 ; i<10; i++) printf("%d ",p[i]);
    printf("\n");
    sum = earn(p,10);
    printf("%d",sum);
    return 0;
}


int earn (int* price ,int n)
{
    int aEarn = 0, bEarn = 0, all = 0;
    int tEarn;
    int imin,imax;
    int i;
    for (i=0; i < n-1;) {
        for(imin=i; i<n && price[imin] >= price[i]; i++) {         //波谷下标放在imin
            imin = i;
        }
        i = imin;
        for(imax=i; i<n && price[imax] <= price[i]; i++) {        //波峰下标放在imax
            imax = i;
        }
        i = imax;
        tEarn = price[imax] - price[imin];                       //这次交易赚的钱暂时放在tEarn
        if(tEarn > all/2) {                                     //这次交易赚的钱放到aEarn和bEarn中较小的中
            if(aEarn > bEarn) {               
                bEarn = tEarn;
            }else {
                aEarn = tEarn;
            }
        }
        all = aEarn + bEarn;
    }
    return all;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值