(动态规划)股票交易日问题

携程2016开发工程师编程题第一题:股票交易日问题,只能一次买进卖出,本是一个很简单的问题,我却用了排序,用最大的减去最小的,好吧,居然通过了65%的测试用例,天真的以为自己终于做对一道线上编程题了,作为一个菜鸟的开始,这就当做我的第一篇博客吧。

-----------------------------------------------------------------------------------------------------------

第一题:求出一天股票买出和买入的最大利润,只有一次买入和卖出的机会

              输入的数据为:2,3,2,4     中间用,隔开

              输出为:2

解答:用Java编写,读取字符串,根据逗号拆分成字符串数组,再转化成整形数组,下面试具体代码

import java.util.*;

public class StockProfit {
	/**
	 * 计算一天   一次买进和卖出后的最大利润
	 * a[]表示一天股票价格的浮动
	 * length价格数组的长度
	 */
	public static int Profit(int a[],int length)
	{
		int maxValue = 0;
	    //用后面的值减去前面的值表示浮动的差值,因为要先买才能卖
		for(int i = length-1; i >=0 ; i--)
		{
			for(int j = i; j >=0;j--){
				if(a[i] > a[j])	{
					if((a[i] -a[j]) > maxValue){
						maxValue = a[i] -a[j];
					}				
				}
			}			
		}
		return maxValue;
	}
	public static void main(String[] args) {
		Scanner sin =new Scanner(System.in);
		String numstring = sin.nextLine();
		String [] datastr = numstring.split(",");
		int [] data = new int[datastr.length];
		for(int i =0; i
   
   

相类似的问题有多种,在网上一搜也有两次买进卖出的,果断学习了一下;

题目:在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买---卖的顺序进行)。给出一天中的股票变化序列,请写一个程序计算一天可以获得的最大收益。请采用实践复杂度低的方法实现。

给定价格序列prices及它的长度n,请返回最大收益。保证长度小于等于500

测试样例:10,22,5,75,65,80

输出:87

解答:用Java编写,只是在求两次是时候把股票的浮动分为2个部分分为求出最大收益,然后求出两次收益之和

import java.util.*;
/**
 * 股票的2次买入卖出买-卖-买-卖这样进行
 * trade函数表示在一个阶段一次买入卖出的最大利润
 * Profit2函数表示分为两次股票购买的最大利润
 */
public class StockProfit2 {
    public static int trade(int val[],int left,int right){
    	int min = val[left],max = 0;    	
    	if(left == right) {return 0;}
    	for(int j = left; j <= right;j++){    		
    		if(val[j] < min) min = val[j];
    		if((val[j] - min)>max) max = val[j] -min;
    	}
    	return max;
    }
	public static int Profit2(int a[],int length){
		int value,maxValue = 0;
		for(int i = 0; i < length;i++)
		{
			value = trade(a,0,i-1) + trade(a,i, a.length-1);//把股票的波动分为两个阶段,分别求最大值
			if(value > maxValue) maxValue = value;
		}		
		return maxValue;
	}
	public static void main(String[] args) {
		Scanner sin =new Scanner(System.in);
		String numstring = sin.nextLine();
		String [] datastr = numstring.split(",");
		int [] data = new int[datastr.length];
		for(int i =0; i
    
    

两次收益的计算方法不同,一个容易理解,一个性能高点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值