Вот статья CodeProject, которая могла бы выручить Вас...
Синтаксический анализатор Параметров командной строки C#/.NET
, ЕСЛИ VB является Вашей разновидностью, вот отдельная статья (с немного большим количеством сходных материалов руководства) для проверки...
Синтаксический анализ и Проверяют Параметры Командной строки с VB.NET
Вот попытка (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;
}
До сих пор я играл с кучей различных входных наборов , и пока у меня не было никаких проблем ... (дайте мне знать, если вы протестируете это и увидите что-нибудь не так)
Я настоятельно рекомендую использовать обновленный ответ Остина Салонена на этот вопрос и адаптируя его к вашему языку.
В 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);
}
Я действительно должен указать в качестве вопроса на собеседовании, ожидая, что вы его решите, поскольку O (n) на грани абсурда. Вопросы на собеседовании призваны доказать, что вы можете решить проблему, которую вы смогли решить. Тот факт, что вы решили это за O (N ^ 2) vs O (N), не имеет значения. Если компания откажется нанять вас за то, что вы не решили эту проблему за O (N), это, вероятно, не та компания, в которой вы бы все равно хотели работать.