Найдите покупают/цены продажи в массиве значений запаса для максимизации положительной разницы

Вот статья CodeProject, которая могла бы выручить Вас...

Синтаксический анализатор Параметров командной строки C#/.NET

, ЕСЛИ VB является Вашей разновидностью, вот отдельная статья (с немного большим количеством сходных материалов руководства) для проверки...

Синтаксический анализ и Проверяют Параметры Командной строки с VB.NET

19
задан Magsol 9 November 2009 в 18:10
поделиться

3 ответа

Вот попытка (C ++). Обычно каждый раз, отслеживая новую вершину, я пытаюсь увидеть, является ли это лучшей прибылью на данный момент. Я знаю, что «дно» должно быть обнаружено раньше. В этот момент я помню верхнюю, нижнюю и текущую максимальную прибыль. Если позже будет обнаружено новое дно, оно ПОСЛЕ текущей вершины, поэтому мы должны сбросить вершину и посмотреть, может ли немного более низкая «вершина» принести большую прибыль.

#include <iostream>

int main()
{

    double REALLY_BIG_NO = 1e99;
    double bottom = REALLY_BIG_NO; // arbirtrary large number
    double currBestBuy = 0.0;
    double top = 0.0;
    double currBestSell = 0.0;
    double profit = 0.0;

    // array of prices
    double prices[] = {10.50, 55.39, 109.23, 48.29, 81.59, 105.53, 94.45, 12.24, 152.0, 2, 170.0};
    int numPrices = 10;// number of prices

    for (int i = 0; i < numPrices; ++i)
    {
         if (prices[i] < bottom)
         {
            bottom = prices[i];
            // reset the search on a new bottom
            top = 0.0;
         }
         else if (prices[i] > top)
         {
            top = prices[i];
           // calculate profit
            double potentialProfit = (top - bottom);
            if (potentialProfit > profit &&
                bottom != REALLY_BIG_NO)
            {
                profit = potentialProfit;
                currBestSell = top;
                currBestBuy = bottom;
            }
         }
    }

    std::cout << "Best Buy: " << currBestBuy << "Best Sell: " << currBestSell << std::endl;
}

До сих пор я играл с кучей различных входных наборов , и пока у меня не было никаких проблем ... (дайте мне знать, если вы протестируете это и увидите что-нибудь не так)

Я настоятельно рекомендую использовать обновленный ответ Остина Салонена на этот вопрос и адаптируя его к вашему языку.

9
ответ дан 30 November 2019 в 04:16
поделиться

В C #:

static void Main(string[] args)
{
    double[] values = new double[7]{55.39, 109.23, 48.29, 81.59, 105.53, 94.45, 12.24};

    double max = double.MinValue, maxDiff = double.MinValue, diff = 0;

    for (int i = 1; i < values.Length; i++)
    {
        if (values[i] > values[i - 1])
        {
            //trending upward, append to existing differential
            diff += values[i] - values[i - 1];
        }
        else
        {
            //trending downward, reset the diff
            diff = 0;
        }

        if (diff > maxDiff)
        {
            maxDiff = diff;
            max = values[i];
        }
    }

    Console.WriteLine("Buy at {0}; Sell at {1}", max - maxDiff, max);
}

РЕДАКТИРОВАТЬ : новый алгоритм, основанный на неудачном тестовом примере @ Joe - Nice Catch BTW! Это также тот же ответ, что и @Doug T's now ...

static void Main(string[] args)
{
    double[] values = new double[8] { 55.39, 109.23, 48.29, 81.59, 81.58, 105.53, 94.45, 12.24 };

    double max = double.MinValue, maxDiff = double.MinValue, diff = 0;
    double bottom = values[0];

    for (int i = 1; i < values.Length; i++)
    {
        diff += values[i] - values[i - 1];

        if (diff > maxDiff)
        {
            maxDiff = diff;
            max = values[i];
        }

        if (values[i] < bottom)
        {
            bottom = values[i];
            diff = 0;
        }
    }

    Console.WriteLine("Buy at {0}; Sell at {1}", max - maxDiff, max);
}
14
ответ дан 30 November 2019 в 04:16
поделиться

Я действительно должен указать в качестве вопроса на собеседовании, ожидая, что вы его решите, поскольку O (n) на грани абсурда. Вопросы на собеседовании призваны доказать, что вы можете решить проблему, которую вы смогли решить. Тот факт, что вы решили это за O (N ^ 2) vs O (N), не имеет значения. Если компания откажется нанять вас за то, что вы не решили эту проблему за O (N), это, вероятно, не та компания, в которой вы бы все равно хотели работать.

0
ответ дан 30 November 2019 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: