(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;
}
Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐