Возможность определить максимальную прибыль может состоять в том, чтобы отслеживать минимальные и правые максимальные элементы левой стороны в массиве по каждому индексу в массиве. Когда вы будете итерировать цены акций, в любой день вы будете знать самую низкую цену до этого дня, и вы также будете знать максимальную цену после (и в том числе) в тот день.
Например , давайте определим min_arr
и max_arr
, причем данный массив будет arr
. Индекс i
в min_arr
будет минимальным элементом в arr
для всех индексов <= i
(слева от i и включает i). Индекс i
в max_arr
будет максимальным элементом в arr
для всех индексов >= i
(справа и в том числе i). Затем вы можете найти максимальную разницу между соответствующими элементами в max_arr
и `min_arr ':
def max_profit(arr)
min_arr = []
min_el = arr.first
arr.each do |el|
if el < min_el
min_el = el
min_arr << min_el
else
min_arr << min_el
end
end
max_arr = []
max_el = arr.last
arr.reverse.each do |el|
if el > max_el
max_el = el
max_arr.unshift(max_el)
else
max_arr.unshift(max_el)
end
end
max_difference = max_arr.first - min_arr.first
1.upto(arr.length-1) do |i|
max_difference = max_arr[i] - min_arr[i] if max_difference < max_arr[i] - min_arr[i]
end
return max_difference
end
Это должно выполняться в O (n) времени, но я считаю, что он использует много пространство.
Если класс [Serialisable]
(т.е. он может быть скопирован вокруг места по мере необходимости), param-меньше конструктора необходимо для десериализации.
я предполагаю, что Вы хотите вынудить доступ своего кода передать значения по умолчанию для Ваших свойств параметризованному конструктору.
В основном Вы говорите, что для XmlSerializer
нормально делать копию и затем устанавливать свойства, но Вы не хотите свой собственный код к.
В некоторой степени я думаю, что это сверхразрабатывает.
Просто добавляют XML-комментарии, которые детализируют, каким свойствам нужна инициализация (и что к).
не используют [Obsolete]
, потому что это не. Зарезервируйте это для по-настоящему устаревших методов.
Можно использовать:
[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
так, чтобы это не обнаруживалось в Intellisence. Если потребитель все еще хочет использовать его, они могут, но это не будет столь же поддающимся обнаружению.
точка Keiths о по разработке все еще стоит все же.
Я прочитал заголовок и сразу думал "устаревший атрибут". Как насчет
/// <summary>
/// do not use
/// </summary>
/// <param name="item">don't pass it anything -- you shouldn't use it.</param>
/// <returns>nothing - you shouldn't use it</returns>
public bool Include(T item) {
....
Я на самом деле был бы склонен не согласиться со всеми, которые защищают использование ObsoleteAttribute
, как в документации MSDN говорится что:
отмечание элемента как устаревший сообщает пользователям, что элемент будет удален в будущих версиях продукта.
, Так как общие конструкторы для сериализации XML не должны быть удалены из приложения, я не применил бы его на всякий случай, разработчик обслуживания в будущем не знаком с тем, как сериализация XML работает.
я на самом деле использовал Keith метод просто замечания, что конструктор используется для сериализации в документации XML так, чтобы это обнаружилось в Intellisense.
Вы могли создать свое собственное Attribute
производный класс, сказать NonCallableAttribute
для квалификации методов, и затем добавить к анализу кода сборки/CI определяют задачу для проверки, чтобы контролировать, если какой-либо код использует те методы.
, По-моему, Вы действительно не можете вынудить разработчиков не использовать метод, но Вы могли обнаружить, когда кто-то нарушил правило как можно скорее, и зафиксируйте его.
Ничего себе, та проблема прослушивает меня также.
Вам также нужны конструкторы по умолчанию для NHibernate, но я хочу вынудить людей НЕ использовать инициализаторы объекта C# 3.0 так, чтобы классы прошли код конструктора.
Разделите свой сериализуемый объект от Вашего объекта области.
То, что Вы ищете, ObsoleteAttribute
класс:
using System;
public sealed class App {
static void Main() {
// The line below causes the compiler to issue a warning:
// 'App.SomeDeprecatedMethod()' is obsolete: 'Do not call this method.'
SomeDeprecatedMethod();
}
// The method below is marked with the ObsoleteAttribute.
// Any code that attempts to call this method will get a warning.
[Obsolete("Do not call this method.")]
private static void SomeDeprecatedMethod() { }
}
ObsoleteAttribute
будет, вероятно, работать в Вашей ситуации - можно даже заставить сборку повреждаться, если тот метод используется.
, Так как устаревшие предупреждения происходят во время компиляции, и так как отражение, необходимое для сериализации, происходит во времени выполнения, отмечание того устаревшего метода не повредит сериализацию, но предупредит разработчиков, что метод не должен там использоваться.
Я использую ObsoleteAttribute
.
, Но также и у Вас могут быть некоторые комментарии, конечно.
И наконец удаляют его полностью, если Вы можете (не должны поддерживать совместимость с чем-то старым). Это - лучший способ.
Да существует.
я записал это сообщение в блоге об этом Работа с разработчиком .
И вот код:
public class MyClass
{
[Obsolete("reason", true)]
public MyClass()
{
// required for xml serialization
}
}