计算你能获得的最大收益。风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。

计算你能获得的最大收益。风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。假设你一开始没有股票,但有至多两次买入1股而后卖出l股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。
设计程序,计算你能获得的最大收益。
输入数值范围:2<=n<=100,0<=prices[i}<=100
(C或Java实现)
输入例子:3, 8, 5, 1, 7, 8

输出结果:12

代码如下:

package practice1;


import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;


public class forff {
public static void main(String[] args) {
int n = 11;
int[][] a = {{2,4,8,1,109,7,2,9,4,110,110},{0,1,2,3,4,5,6,7,8,9,10}};
//int[][] a = {{2,4,8,1,109,7,4,6,2,110},{0,1,2,3,4,5,6,7,8,9}};
/*int n = 8;
int[][] a = {{3,5,1,7,22,1,5,3}, {0,1,2,3,4,5,6,7}};
int n = 6;
int[][] a = {{3,8,5,1,7,8},{0,1,2,3,4,5}};
*/
/*
* for(int i=0;i<2;i++) for(int j=0;j<n;j++){ a[i][j]=new
* Scanner(System.in).nextInt(); }
*/
//排序:从大到小
for (int i = 0; i < n; i++) {
for (int j = 1; j < n - i; j++) {
if (a[0][j] > a[0][j - 1]) {
int b = a[0][j];
a[0][j] = a[0][j - 1];
a[0][j - 1] = b;


b = a[1][j];
a[1][j] = a[1][j - 1];
a[1][j - 1] = b;
}
}
}

List<Integer> sum1 =new ArrayList<Integer> () ,/*sum1记录可收益所有可能*/ 
sum2 = new ArrayList<Integer>(),/*sum2记录可收益所有可能时的最高股价下标*/
sum3=new ArrayList<Integer>();/*sum3记录可收益所有可能时的买入股价下标*/
for (int i = 0; i < n; i++) {
int c = n-1;
while (c > i) {
if (a[1][i] > a[1][c]) {//有收益

sum1.add(a[0][i] - a[0][c]);/*sum1记录可收益所有可能*/ 
sum2.add(a[1][i]);/*sum2记录可收益所有可能时的最高股价下标*/
sum3.add(a[1][c]);/*sum3记录可收益所有可能时的买入股价下标*/



}
c--;
}
}
List<Integer>  totalSum=new ArrayList<Integer>();//记录两次卖出的总收益所有可能组合
for (int i = 0; i < sum1.size(); i++) {
List<Integer> sum = new ArrayList<Integer>();//记录一次for循环产生的一组可能组合
for (int j = 0; j < sum2.size(); j++) {
if (sum3.get(j) >sum2.get(i)) {//第二次买入时的下标必须大于第一次卖出的下标

sum.add(sum1.get(j) +sum1.get(i));


}
}

totalSum.addAll(sum);
}
Collections.sort(totalSum);//排序

System.out.println(totalSum.get(totalSum.size()-1));//输出
}
}

便于观察结果:

 package practice1;

import java.util.Scanner;

public class forff {
public static void main(String[] args) {
/*int n = 10;
int[][] a = {{2,4,8,1,110,7,4,6,1,110},{0,1,2,3,4,5,6,7,8,9}};
int n = 8;
int[][] a = {{3,5,1,7,22,1,5,3}, {0,1,2,3,4,5,6,7}};
*/ int n = 6;
int[][] a = {{3,8,5,1,7,8},{0,1,2,3,4,5}};

/*
 * for(int i=0;i<2;i++) for(int j=0;j<n;j++){ a[i][j]=new
 * Scanner( System.in 

).nextInt(); }
 */
for (int i = 0; i < n; i++) {
for (int j = 1; j < n - i; j++) {
if (a[0][j] > a[0][j - 1]) {
int b = a[0][j];
a[0][j] = a[0][j - 1];
a[0][j - 1] = b;

b = a[1][j];
a[1][j] = a[1][j - 1];
a[1][j - 1] = b;
}
}
}
String sum1 = "", sum2 = "",sum3="";
for (int i = 0; i < n; i++) {
int c = n-1;
while (c > i) {
if (a[1][i] > a[1][c]) {
if (sum1.equals("")) {
sum1 = "" + (a[0][i] - a[0][c]);
sum2 = "" + a[1][i];
sum3 = "" + a[1][c];
} else {
sum1 = sum1 + "," + (a[0][i] - a[0][c]);
sum2 = sum2 + "," + a[1][i];
sum3 = sum3 +"," + a[1][c];
}

}
c--;
}
}
System.out.println(sum1);
System.out.println(sum2);
System.out.println(sum3);
String[] s1 = sum1.split(",");
String[] s2 = sum2.split(",");
String[] s3 = sum3.split(",");
String totalSum="";
for (int i = 0; i < s1.length; i++) {
String sum = "";
for (int j = 0; j < s2.length; j++) {
if (Integer.parseInt(s3[j]) > Integer.parseInt(s2[i])) {
if (sum.equals("")) {
sum = "" + (Integer.parseInt(s1[j]) + Integer.parseInt(s1[i]));

} else {
sum = sum + "," + (Integer.parseInt(s1[j]) + Integer.parseInt(s1[i]));
}
}
}
System.out.println(sum);
if(totalSum.equals("")){

totalSum=sum;
}else{
if(sum.equals(""));
else
totalSum=totalSum+","+sum;
}


}
String[] tot=totalSum.split(",");
int max=Integer.parseInt(tot[0]);
for(int i=1;i<tot.length;i++){
if(max<Integer.parseInt(tot[i]))
max=Integer.parseInt(tot[i]);
}
System.out.println(max);
}
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值