名企笔试:美团2016招聘笔试(股票交易日)
题目描述
在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买-卖-买-卖的顺序进行)。给出一天中的股票变化序列,请写一个程序计算一天可以获得的最大收益。请采用实践复杂度低的方法实现。
给定价格序列prices及它的长度n,请返回最大收益。保证长度小于等于500。
测试样例:
[10,22,5,75,65,80],6
题目描述
在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买-卖-买-卖的顺序进行)。给出一天中的股票变化序列,请写一个程序计算一天可以获得的最大收益。请采用实践复杂度低的方法实现。
给定价格序列prices及它的长度n,请返回最大收益。保证长度小于等于500。
测试样例:
[10,22,5,75,65,80],6
返回:87
import java.util.Scanner;
public class Stock trading day {
public static void main(String[] args) {
/*输入价格序列*/
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int price[]=new int[n];//价格序列
for(int i=0;i<price.length;i++){
price[i]=sc.nextInt();
}
int priceChange[]=new int[price.length];//价格序列相邻两个值的差值
for(int i=1;i<priceChange.length;i++){
priceChange[i]=price[i]-price[i-1];
}
/* for(int i=0;i<priceChange.length;i++){
System.out.print(priceChange[i]+" ");;
}
System.out.println();*/
/*遍历价格差值数组 从左到右*/
int sum=0,maxProfit=0;//最大利润
int max=0;
int b[]=new int[priceChange.length];
int c[]=new int[priceChange.length];
for(int i=1;i<priceChange.length;i++){
if(sum<0){
sum=0;
}
sum+=priceChange[i];
if(max<sum){
max=sum;
b[i]=sum;
}else{
b[i]=max;
}
}
/* for(int i=0;i<b.length;i++){
System.out.print(b[i]+" ");
}
System.out.println(); */
/*遍历价格差值数组 从右到左*/
sum=0;
max=0;
for(int i=priceChange.length-1;i>0;i--){
if(sum<0){
sum=0;
}
sum+=priceChange[i];
if(max<sum){
max=sum;
c[i]=sum;
}else{
c[i]=max;
}
}
/*for(int i=0;i<b.length;i++){
System.out.print(c[i]+" ");
}
System.out.println(); */
for(int i=1;i<priceChange.length;i++){
if(maxProfit<b[i-1]+c[i]){
maxProfit=b[i-1]+c[i];
}
}
System.out.println("最大利润为:"+maxProfit);
}
}
}