zoukankan      html  css  js  c++  java
  • Maximum profit of stocks

    https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Mock%20Interviews/Large%20E-Commerce%20Company/E-Commerce%20Company%20-%20Interview%20Problems%20-%20SOLUTIONS/On-Site%20Question%201%20-%20SOLUTION.ipynb

    On-Site Question 1 - SOLUTION

    Problem

    You've been given a list of historical stock prices for a single day for Amazon stock. The index of the list represents the timestamp, so the element at index of 0 is the initial price of the stock, the element at index 1 is the next recorded price of the stock for that day, etc. Your task is to write a function that will return the maximum profit possible from the purchase and sale of a single share of Amazon stock on that day. Keep in mind to try to make this as efficient as possible.

    For example, if you were given the list of stock prices:

    prices = [12,11,15,3,10]

    Then your function would return the maximum possible profit, which would be 7 (buying at 3 and selling at 10).

    Requirements

    Try to solve this problem with paper/pencil first without using an IDE. Also keep in mind you should be able to come up with a better solution than just brute forcing every possible sale combination

    Also you can't "short" a stock, you must buy before you sell the stock.

     

    Solution

    Let's think about a few things before we start coding. One thing to think about right off the bat is that we can't just find the maximum price and the lowest price and then subtract the two, because the max could come before the min.

    The brute force method would be to try every possible pair of price combinations, but this would be O(N^2), pretty bad. Also since this is an interview setting you should probably already know that there is a smarter solution.

    In this case we will use a greedy algorithm approach. We will iterate through the list of stock prices while keeping track of our maximum profit.

    That means for every price we will keep track of the lowest price so far and then check if we can get a better profit than our current max.

    Let's see an implementation of this:



    def profit(stock_prices):
        
        # Start minimum price marker at first price
        min_stock_price = stock_prices[0]
        
        # Start off with a profit of zero
        max_profit = 0
        
        for price in stock_prices:
            
            # Check to set the lowest stock price so far
            min_stock_price = min(min_stock_price,price)
            
            # Check the current price against our minimum for a profit 
            # comparison against the max_profit
            comparison_profit = price - min_stock_price
            
            # Compare against our max_profit so far
            max_profit = max(max_profit,comparison_profit)
            
        return max_profit


    In [4]:
    profit([10,12,14,12,13,11,8,7,6,13,23,45,11,10])
    
    Out[4]:
    39
     

    Currently we're finding the max profit in one pass O(n) and in constant space O(1). However, we still aren't thinking about any edge cases. For example, we need to address the following scenarios:

    • Stock price always goes down
    • If there's less than two stock prices in the list.

    We can take care of the first scenario by returning a negative profit if the price decreases all day (that way we can know how much we lost). And the second issue can be solved with a quick len() check. Let's see the full solution:



    def profit2(stock_prices):
        
        # Check length
        if len(stock_prices) < 2:
            raise Exception('Need at least two stock prices!')
        
        # Start minimum price marker at first price
        min_stock_price = stock_prices[0]
        
        # Start off with an initial max profit
        max_profit = stock_prices[1] - stock_prices[0]
        
        # Skip first index of 0
        for price in stock_prices[1:]:
            
            
            # NOTE THE REORDERING HERE DUE TO THE NEGATIVE PROFIT TRACKING
            
            # Check the current price against our minimum for a profit 
            # comparison against the max_profit
            comparison_profit = price - min_stock_price
            
            # Compare against our max_profit so far
            max_profit = max(max_profit,comparison_profit)
            
            # Check to set the lowest stock price so far
            min_stock_price = min(min_stock_price,price)
            
            
            
            
            
        return max_profit


    In [11]:
    # Exception Raised
    profit2([1])
    
     
    ---------------------------------------------------------------------------
    Exception                                 Traceback (most recent call last)
    <ipython-input-11-7bd2f0c7e63b> in <module>()
          1 # Exception Raised
    ----> 2 profit2([1])
    
    <ipython-input-10-e06adf3c45a7> in profit2(stock_prices)
          3     # Check length
          4     if len(stock_prices) < 2:
    ----> 5         raise Exception('Need at least two stock prices!')
          6 
          7     # Start minimum price marker at first price
    
    Exception: Need at least two stock prices!
    In [12]:
    profit2([30,22,21,5])
    
    Out[12]:
    -1
     

    Great! Now we can prepare for worst case scenarios. Its important to keep edge cases in mind, especially if you are able to solve the original question fairly quickly.

    Good Job!

  • 相关阅读:
    python接口自动化测试二十四:上传多个附件,参数化
    python接口自动化测试二十三:文件上传
    python接口自动化测试二十二:文件下载
    python接口自动化测试二十一:类和方法
    Delphi开发ocx插件的调试
    Confluence 6 推荐的更新通知设置和禁用
    Confluence 6 配置推荐更新邮件通知默认的初始化设置
    为 Confluence 6 分发包设置一个邮件会话
    Confluence 6 测试电子邮件设置
    为 Confluence 6 配置发送邮件消息
  • 原文地址:https://www.cnblogs.com/prmlab/p/6958433.html
Copyright © 2011-2022 走看看