携程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
两次收益的计算方法不同,一个容易理解,一个性能高点