(100分)- 最大股票收益(Java & JS & Python & C)
·
(100分)- 最大股票收益(Java & JS & Python & C)
题目描述
假设知道某段连续时间内股票价格,计算通过买入卖出可获得的最大收益。
输入一个大小为 n 的数 price(p1,p2,p3,p4…….pn),pi 是第i天的股票价格。
pi 的格式为股票价格(非负整型)加上货币单位 Y 或者 S,其中 Y 代表人民币,S 代表美元,这里规定 1 美元可以兑换 7 人民币。
Pi 样例 1:123Y 代表 123 元人民币
pi 样例 2:123S 代表 123 元美元,可兑换 861 人民币。
假设你可以在任何一天买入或者卖出股票,也可以选择放弃交易,请计其在交易周期 n 天内你能获得的最大收(以人民币计算)。
输入描述
输入一个包含交易周期内各天股票价格的字符串,以空格分隔。不考虑输入异常情况。
输出描述
输出一个整型数代表在交易周期 n 天内你能获得的最大收益,n 不能超过 10000
备注:股票价格只会用 Y 人民币或 S 美元进行输入,不考虑其他情况。
用例
| 输入 | 2Y 3S 4S 6Y 8S |
| 输出 | 76 |
| 说明 | 无 |
题目解析
这道题目隐含了一个关键限制:同一时间只能持有一只股票,不可同时持有多个。
举例说明,若允许同时持有多个股票,以用例2Y 3S 4S 6Y 8S为例:可以全部买入前四只股票,然后统一以8S的价格卖出。此时最大利润为:8S×4 - (2Y + 3S + 4S + 6Y) = 167,而非题目给出的76。
由此可见,题目中76这个结果正是基于"单只持仓"的前提计算得出的。

具体操作如下:
2Y买入,3S卖出,盈利19 3S买入,4S卖出,盈利7 6Y买入,8S卖出,盈利50 总利润:76
这是典型的上升趋势交易策略,只在价格上涨时买入,确保每次交易都能获利。如图所示,我们只选择价格上升阶段进行交易,完全规避下跌风险。
JavaScript算法源码
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
const arr = line.split(" ").map((price) => {
const num = parseInt(price.substring(0, price.length - 1));
return price.at(-1) === "Y" ? num : num * 7;
});
console.log(getResult(arr));
});
function getResult(arr) {
let ans = 0;
for (let i = 1; i < arr.length; i++) {
ans += Math.max(0, arr[i] - arr[i - 1]);
}
return ans;
}
Java算法源码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
// 输入获取
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Integer[] arr =
Arrays.stream(sc.nextLine().split(" "))
.map(
p -> {
int num = Integer.parseInt(p.substring(0, p.length() - 1));
String unit = p.substring(p.length() - 1);
return "Y".equals(unit) ? num : num * 7;
})
.toArray(Integer[]::new);
System.out.println(getResult(arr));
}
// 算法入口
public static int getResult(Integer[] arr) {
int ans = 0;
for (int i = 1; i < arr.length; i++) {
ans += Math.max(0, arr[i] - arr[i - 1]);
}
return ans;
}
}
Python算法源码
# 输入获取
tmp = input().split()
# 输入转换
def convert(s):
num = int(s[:-1])
unit = s[-1]
if unit == 'Y':
return num
else:
return num * 7
arr = list(map(convert, tmp))
# 算法入口
def getResult():
ans = 0
for i in range(1, len(arr)):
ans += max(0, arr[i] - arr[i - 1])
return ans
# 算法调用
print(getResult())
C算法源码
#include <stdio.h>
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define MAX_SIZE 10000
int main() {
int incomes[MAX_SIZE];
int incomes_size = 0;
int num;
char unit;
while(scanf("%d%c", &num, &unit)) {
incomes[incomes_size] = num * (unit == 'Y' ? 1 : 7);
incomes_size++;
if(getchar() != ' ') break;
}
int ans = 0;
for(int i=1; i<incomes_size; i++) {
ans += MAX(0, incomes[i] - incomes[i-1]);
}
printf("%d\n", ans);
return 0;
}更多推荐



所有评论(0)