<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Пётр</title><generator>teletype.in</generator><description><![CDATA[Пётр]]></description><image><url>https://teletype.in/files/6c/6caeafc7-8546-49f1-8e36-36f5adc3b0a1.jpeg</url><title>Пётр</title><link>https://teletype.in/@sitroman</link></image><link>https://teletype.in/@sitroman?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sitroman</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/sitroman?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/sitroman?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 30 Apr 2026 09:45:20 GMT</pubDate><lastBuildDate>Thu, 30 Apr 2026 09:45:20 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@sitroman/SkEGU6tzE</guid><link>https://teletype.in/@sitroman/SkEGU6tzE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sitroman</link><comments>https://teletype.in/@sitroman/SkEGU6tzE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sitroman#comments</comments><dc:creator>sitroman</dc:creator><title>Leetcode.com, задача №121. &quot;Лучшее время для покупки и продажи акций&quot;</title><pubDate>Mon, 14 Jan 2019 08:19:23 GMT</pubDate><description><![CDATA[Дан массив значений стоимости акций. Разрешено сделать одну транзакцию: покупка и продажа. И только в таком порядке. Необходимо вычислить максимальную прибыль, которую можно получить. В противном случае вернуть 0.]]></description><content:encoded><![CDATA[
  <h2>Условие</h2>
  <p>Дан массив значений стоимости акций. Разрешено сделать одну транзакцию: покупка и продажа. И только в таком порядке. Необходимо вычислить максимальную прибыль, которую можно получить. В противном случае вернуть 0.</p>
  <h2>Пример №1</h2>
  <p><strong>Входной массив:</strong> [7, 1, 5, 3, 6, 4]</p>
  <p><strong>Максимальная прибыль:</strong> 5</p>
  <p><strong>Объяснение:</strong> покупаем акции на второй день по цене 1, продаём - на пятый по цене 6, получается прибыль 5. Продавать по 7 мы не можем, т.к. сначала нужно купить акции.</p>
  <h2>Пример №2</h2>
  <p><strong>Входной массив:</strong> [7, 6, 4, 3, 1]</p>
  <p><strong>Максимальная прибыль:</strong> 0</p>
  <p><strong>Объяснение:</strong> мы не можем в последующие дни купить по цене большей, чем продали в любой день.</p>
  <h2>Вариант №1 решения</h2>
  <p>Прежде всего, выразим задачу математически. От нас требуется найти <em>max(price[j] - max[i])</em> при<em> j &gt; i</em>.</p>
  <p>Для начала попробуем простой перебор:</p>
  <pre>public class Solution {
    public int MaxProfit(int[] prices) {
        int delta;
        int maxProfit = 0;            
        for (int i = 0; i &lt; prices.Length; i++)
        {                
            for (int j = i + 1; j &lt; prices.Length; j++)
            {
                delta = prices[j] - prices[i];
                if (delta &gt; 0)
                    maxProfit = Math.Max(maxProfit, delta);
            }
        }
        return maxProfit;
    }
}
</pre>
  <p>Главный недостаток перебора - время выполнения, которое в данном случае пропорционально <em>n * (n - 1) / 2</em>, где<em> n</em> - количество элементов в массиве. Поэтому временная сложность равняется квадрату количества элементов <strong>О(n * n)</strong>.</p>
  <h2>Вариант №2</h2>
  <p>Для решения задачи лучшим способом достаточно одного прохода по массиву. При этом будем отмечать или перезаписывать наименьшее значение и вычислять по отношению к нему разницу со значениями последующих элементов.</p>
  <pre>public class Solution {
    public int MaxProfit(int[] prices) {
        if (prices.Length &lt; 2)
            return 0;

        int maxProfit = 0;
        int minValue = prices[0];
            
        for (int i = 1; i &lt; prices.Length; i++)
        {
            if (prices[i] &lt; minValue)
            {
                minValue = prices[i];
                continue;
            }
            else
            {
                if (prices[i] - minValue &gt; maxProfit)
                    maxProfit = prices[i] - minValue;
            }
        }
        return maxProfit;
    }
}
</pre>
  <p>Временная сложность данного решения - <strong>О(n)</strong>.</p>
  <p>Так как на сайте можно смотреть лучшие по быстродействию решения, то свой первоначальный код я немного изменил.</p>
  <p>В самом начале добавлена проверка на нулевой массив и массив с одним элементом:</p>
  <pre>if (prices.Length &lt; 2)
    return 0;
</pre>
  <p>После этой проверки инициализируется переменная <em>minValue</em> нулевым элементом массива. Это позволяет начать цикл <em>for</em> с первого элемента.</p>
  <p>В самом цикле после нахождения минимального значения используется ключевое слово continue, немедленно запускающее следующую итерацию.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@sitroman/r1K1UTYfE</guid><link>https://teletype.in/@sitroman/r1K1UTYfE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sitroman</link><comments>https://teletype.in/@sitroman/r1K1UTYfE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sitroman#comments</comments><dc:creator>sitroman</dc:creator><title>Установка Microsoft SQL Server Management Studio без интернета</title><pubDate>Mon, 14 Jan 2019 08:18:41 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/a6/a67248c8-bf21-49e6-b4f9-4758d6a4dc81.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/8e/8ec4fee0-7d79-40e7-8e71-fbd93cb4d257.png"></img>В данный момент изучаю Microsoft SQL Server. Для конфигурирования, управления и администрирования всех компонентов этой СУБД (система управления базами данных) используется утилита Management Studio. И понадобилось её установить в отсутствии интернета. Процесс при определённых знаниях несложный, но я на него потратил пару часов. Поэтому делюсь полученными навыками.]]></description><content:encoded><![CDATA[
  <p>В данный момент изучаю Microsoft SQL Server. Для конфигурирования, управления и администрирования всех компонентов этой СУБД (система управления базами данных) используется утилита Management Studio. И понадобилось её установить в отсутствии интернета. Процесс при определённых знаниях несложный, но я на него потратил пару часов. Поэтому делюсь полученными навыками.</p>
  <p><strong>1.</strong>Устанавливаем Microsoft SQL Server из скаченного заранее файла. Я установил старенькую версию 2012. Её функций более чем достаточно для изучения запросов к базу данных. Во всех окнах во смело жмём &quot;Далее&quot;, только при выборе компонентов можно оставить галочки у пунктов &quot;Службы компонента Database Engine&quot;, &quot;Репликация SQL Server&quot; и &quot;Пакет SDK средств связи клиента SQL&quot;.</p>
  <p><strong>2. </strong>Запускаем установщик Managment Sudio. Выбираем &quot;Новая установка изолированного экземпляра ...&quot;</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/8e/8ec4fee0-7d79-40e7-8e71-fbd93cb4d257.png" width="800" />
  </figure>
  <p><strong>3.</strong> Добавляем компоненты в существующий экземпляр, созданные при установке в п.1</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/c4/c4e68334-ae4c-46b2-9994-a87f902d80e0.png" width="820" />
  </figure>
  <p><strong>4.</strong> При выборе компонентов ставим галочку &quot;Средства управления - основные&quot;.</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/41/416d4af4-09e2-4491-b079-edf976744f98.png" width="820" />
  </figure>
  <p><strong>5.</strong> Потом везде жмём &quot;Далее&quot; и готово!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@sitroman/HkNaBaKzE</guid><link>https://teletype.in/@sitroman/HkNaBaKzE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sitroman</link><comments>https://teletype.in/@sitroman/HkNaBaKzE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sitroman#comments</comments><dc:creator>sitroman</dc:creator><title>Разбор теста от proglib.io, ч.3</title><pubDate>Mon, 14 Jan 2019 08:18:04 GMT</pubDate><description><![CDATA[17. Что является идентификатором метода при перегрузке?]]></description><content:encoded><![CDATA[
  <p>17. Что является идентификатором метода при перегрузке?</p>
  <ul>
    <li><strong>имя и параметры</strong>;</li>
    <li>модификаторы доступа, возвращаемый тип и параметры;</li>
    <li><s>имя, параметры, возвращаемый тип</s>;</li>
    <li>параметры и модификаторы доступа.</li>
  </ul>
  <p>18. Что означает ключевое слово &quot;params&quot;?</p>
  <ul>
    <li><strong>Параметр метода будет принимать переменное число аргументов</strong>.</li>
    <li>Инициирует передачу аргументов по ссылке.</li>
    <li>Ссылается на глобальное пространство имён.</li>
    <li>Ссылается на переданные аргументы командной строки.</li>
  </ul>
  <p>19. Что из ниже перечисленного не может иметь модификатор &quot;virtual&quot;?</p>
  <ul>
    <li>методы;</li>
    <li>свойства;</li>
    <li>индексаторы;</li>
    <li><strong>поля</strong>.</li>
  </ul>
  <p>20. Какой результат выполнения следующей программы?</p>
  <pre>public class A
{
    private string name = &quot;Name&quot;;

    public void Display()
    {
        Display2(ref name, ref name);
        Console.WriteLine(name);
    }

    public void Display2(ref string x, ref string y)
    {
        Console.WriteLine(name);
        x = &quot;Name 1&quot;;
        Console.WriteLine(name);
        y = &quot;Name 2&quot;;
        Console.WriteLine(name);
        name = &quot;Name 3&quot;;
    }
}
class Program
{
    static void Main(string[] args)
    {
        A overload = new A();
        overload.Display();
        Console.ReadKey();
    }
}
</pre>
  <ul>
    <li>Произойдёт ошибка компиляции.</li>
    <li>Name 1 Name 2 Name 3 Name.</li>
    <li><strong>Name Name 1 Name 2 Name 3</strong>.</li>
    <li>Четвёртый вариант.</li>
  </ul>
  <p>21. Среди перечисленных конструкций укажите определение индексатора.</p>
  <ul>
    <li>string GetName { } { return &quot;Name&quot;; }</li>
    <li>string Name [int i]</li>
    <li><s>string Name { get { return &quot;Name&quot;; } }</s></li>
    <li><strong>string this [int i] { get { return &quot;Name&quot;; } }</strong></li>
  </ul>
  <p><em>P.S. Ничего не знал про индексаторы. Не угадал.</em></p>
  <p>22. Что выведет на экран программа ниже?</p>
  <pre>class Program
{
    static void Main(string[] args)
    {
        string s;
        s += &quot;string&quot;;
        Console.WriteLine(s);
    }
}
</pre>
  <ul>
    <li><em><s>string</s></em>;</li>
    <li>&quot;string&quot;;</li>
    <li><strong>возникнет ошибка компиляции</strong>;</li>
    <li>возникнет ошибка времени выполнения.</li>
  </ul>
  <p><em>P.S. Дааа, строки надо инициализировать.</em></p>
  <p>23. Как правильно определять структуры?</p>
  <ul>
    <li><s>struct &lt;Имя структуры&gt; () { ... }</s></li>
    <li>struct &lt;Имя структуры&gt; (string[ ] args) { ... }</li>
    <li>struct { ... }</li>
    <li><strong>struct &lt;Имя структуры&gt; { ... }</strong></li>
  </ul>
  <p>24. Какой из перечисленных типов не является значимым?</p>
  <ul>
    <li>float;</li>
    <li><strong>class</strong>;</li>
    <li>struct;</li>
    <li>int.</li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@sitroman/ByndrpKMN</guid><link>https://teletype.in/@sitroman/ByndrpKMN?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sitroman</link><comments>https://teletype.in/@sitroman/ByndrpKMN?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sitroman#comments</comments><dc:creator>sitroman</dc:creator><title>Разбор теста от proglib.io, ч.2</title><pubDate>Mon, 14 Jan 2019 08:16:52 GMT</pubDate><description><![CDATA[9. Какой будет результат выполнения следующего кода?]]></description><content:encoded><![CDATA[
  <p>9. Какой будет результат выполнения следующего кода?</p>
  <pre>public sealed class Car
{
  public readonly int maxSpeed = 0;
  private int currSpeed;
  public Car()
  {
    maxSpeed = 220;
  }
  public Car(int max)
  {
    maxSpeed = max;
  }
  public int Speed
  {
    get { return currSpeed; }
    set
    {
      currSpeed = value;
      if (currSpeed &gt; maxSpeed)
      {
        currSpeed = maxSpeed;
      }
    }
  }
}

public class B : Car
{
  public void Display()
  {
    Console.WriteLine(Speed);
  }
}

class Program
{
  static void Main(string[] args)
  {
    B b = new B();
    b.Speed = 300;
    b.Display();
  }
}
</pre>
  <ul>
    <li>0;</li>
    <li><s>220</s>;</li>
    <li>300;</li>
    <li><strong>ошибка на этапе компиляции.</strong></li>
  </ul>
  <p><em>P.S. Не заметил, что class Car запечатанный, а значит class B не может от него наследовать.</em></p>
  <p>10.Можно ли наследовать конструктор и деструктор базового класса?</p>
  <ul>
    <li><s>да;</s></li>
    <li><strong>нет</strong>;</li>
    <li>иногда.</li>
  </ul>
  <p><em>P.S. Конструктор базового класса не наследуется, но можно использовать или расширять его через специально слово </em><strong>base</strong><em>.</em></p>
  <p>11. В результате компиляции программы ниже возникнет ошибка, связанная с вызовом метода SomeMethod. Как его правильно вызвать, чтобы программа скомпилировалась?</p>
  <pre>interface IA
{
  void SomeMethod();
}
  
class A : IA
{
  void IA.SomeMethod()
  {
    Console.WriteLine(&quot;Hello&quot;);
  }
}
        
class Program
{
  static void Main(string[] args)
  {
    A a = new A();
    a.SomeMethod();
  }        
}
</pre>
  <ul>
    <li>Никак. Ошибки не возникнет.</li>
    <li><strong>Использовать оператор as ((a as IA).SomeMethod()).</strong></li>
    <li>Использовать оператор is ((a is IA).SomeMethod()).</li>
    <li><s>Использовать полное название метода a.IA.SomeMethod()</s>.</li>
  </ul>
  <p>12. Что выведет программа ниже?</p>
  <pre>public class A
{
    public A()
    {
        Console.Write(&quot;A created; &quot;);
    }
}

public class B : A
{
    private B()
    {
        Console.Write(&quot;B created; &quot;);
    }

    public B(string str)
    {
        Console.Write(&quot;B created with string: {0}; &quot;, str);
    }
}

public class C : B
{
    public C()
    {
        Console.Write(&quot;C created; &quot;);
    }
}

class Program
{
    static void Main(string[] args)
    {
        A ab = new B(&quot;parameter&quot;);
        A ac = new C();

        Console.ReadKey();
    }        
}
</pre>
  <ul>
    <li>A created; B created with string: parameter; A created; B created; C created;</li>
    <li><s>Еще два варианта</s>.</li>
    <li><strong>Программа не скомпилируется</strong>.</li>
  </ul>
  <p><em>P.S. Будет ошибка на этапе компиляции, так как класс С не может наследовать от класса B с конструктором по умолчанию с доступом private.</em></p>
  <p>13. Существует ли возможность отказаться от реализации абстрактного класса в классе наследнике?</p>
  <ul>
    <li>Нет, невозможно отказаться от реализации абстрактного класса.</li>
    <li>Да, если пометить класс-наследник атрибутом [NonAbstract].</li>
    <li><strong>Да, если пометить класс-наследник как абстрактный</strong>.</li>
    <li><s>Да, достаточно не реализовывать ненужные методы и свойства</s>.</li>
  </ul>
  <p>14. Что неверно в определении следующих интерфейсов?</p>
  <pre>public abstract interface IAction
{
    void Move();
}

internal interface IRunAction : IAction
{
    void Run();
}
</pre>
  <ul>
    <li>Интерфейсы не могут иметь модификатор доступа internal.</li>
    <li><strong>Интерфейсы не могут иметь модификатор abstract</strong>.</li>
    <li>Интерфейс IRunAction должен определить метод Move, так как базовый интерфейс IAction является абстрактным.</li>
    <li>От абстрактного интерфейса нельзя наследоваться.</li>
  </ul>
  <p><em>P.S. Смекнул, что абстрактный интерфейс - это перебор</em>.</p>
  <p>15. Какая из строк вызовет ошибку компиляции?</p>
  <pre>interface IList
{
    int Count { get; set; }
}

interface ICounter
{
    void Count(int i);
}

interface IListCounter : IList, ICounter { }

class C
{
    void Test(IListCounter x)   // 1
    {
        x.Count(1);             // 2
        x.Count = 1;            // 3
    }
}

public class Program
{
    private static void Main(string[] args)
    {

    }
}
</pre>
  <ul>
    <li>1;</li>
    <li>2;</li>
    <li><strong>3</strong>;</li>
    <li><s>никакая, программа рабочая</s>.</li>
  </ul>
  <p><em>P.S. В данном случае название метода в приоритете, поэтому будет ошибка в строчке с одноимённым свойством.</em></p>
  <p>16. Какое утверждение об абстрактных методах неверно?</p>
  <ul>
    <li>Абстрактный метод неявно представляет собой виртуальный метод.</li>
    <li>Объявления абстрактных методов допускаются только в виртуальных классах.</li>
    <li><strong>В объявлении абстрактного метода можно использовать статические или виртуальные модификаторы.</strong></li>
    <li>Чтобы реализовать абстрактный метод в классе-наследнике, необходимо использовать ключевое слово override.</li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@sitroman/H1SSrptfV</guid><link>https://teletype.in/@sitroman/H1SSrptfV?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sitroman</link><comments>https://teletype.in/@sitroman/H1SSrptfV?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sitroman#comments</comments><dc:creator>sitroman</dc:creator><title>Разбор теста от proglib.io, ч.1</title><pubDate>Mon, 14 Jan 2019 08:15:57 GMT</pubDate><description><![CDATA[Зачёркнутым шрифтом выделены мои неправильные ответы, жирным - верные ответы на вопросы.]]></description><content:encoded><![CDATA[
  <p><s>Зачёркнутым</s> шрифтом выделены мои неправильные ответы, <strong>жирным</strong> - верные ответы на вопросы.</p>
  <ol>
    <li>ООП поддерживает два вида связывания объектов с кодом методов. Соответствующие методы называются:</li>
  </ol>
  <ul>
    <li>виртуальными и абстрактными;</li>
    <li><strong>статическими и виртуальными</strong>;</li>
    <li><s>абстрактными и статическими</s>;</li>
    <li>публичными и приватными.</li>
  </ul>
  <p><em>P.S. Соответствующие виды связывания: раннее и позднее. Понятия не имел о правильном ответе. Даже после выяснения верного варианта...</em></p>
  <p>2. Какая разница между идентичностью и равенством объектов?</p>
  <ul>
    <li>Идентичность означает, что у объектов есть общий неабстрактный предок, а равенство - любой общий предок.</li>
    <li>Идентичность означает, что у объектов одинаковые поля, а равенство - что они содержат одинаковые данные.</li>
    <li>Идентичность означает, что объекты являются экземпляром одного и того же класса, а равенство - что они содержат одинаковые данные.</li>
    <li><strong>Идентичность означает, что две ссылки указывают на один и тот же объект, а равенство - что они содержат одинаковые данные.</strong></li>
  </ul>
  <p>3. Какое утверждение верно?</p>
  <ul>
    <li>От структуры так же, как и от класса, можно наследоваться.</li>
    <li>Если структура или объект класса присваивается новому объекту, то в новую переменную сохраняется копия всех данных.</li>
    <li><strong>Структура является размерным типом, а класс - ссылочный.</strong></li>
    <li>В структуре нельзя определять конструктор.</li>
  </ul>
  <p>4. В чём разница между перегрузкой (overloading) и переопределением (overriding)?</p>
  <ul>
    <li>Её не существует. Оба понятия описывают одно и то же явление.</li>
    <li>Перегрузка означает наличие двух методов с теми же аргументами, но с различными реализациями. Один из них будет существовать в родительском классе, а другой - в производном или дочернем классе.</li>
    <li>Переопределение означает наличие двух или более методов в одном классе с тем же именем, но с разными аргументами.</li>
    <li><strong>Ни один из предложенных вариантов не является верным.</strong></li>
  </ul>
  <p><em>P.S. Пункты 2 и 3 являются определениями для переопределения и перегрузки соответственно.</em></p>
  <p>5. Скомпилируется ли программа ниже?</p>
  <pre>public class A
{
  public string Str { get; protected internal set; } = &quot;Hello&quot;;
}
class Program
{
  static void Main(string[] args) 
  {
  A a = new A();
  a.Str += &quot; World&quot;;
  Console.WriteLine(a.Str);
  }
}
</pre>
  <ul>
    <li><strong>да;</strong></li>
    <li><s>ещё три варианта.</s></li>
  </ul>
  <p><em>P.S. Что-то меня смутил модификатор доступа сеттера свойства Str, и я ответил неверно. Хотя классы и члены классов с модификатором доступа</em><strong>protected internal </strong><em>доступны из текущей сборки (и из производных классов).</em></p>
  <p>6. Какое из утверждений верно?</p>
  <ul>
    <li><strong>У интерфейсов можно объявлять свойства, но без тела у методов доступа свойства</strong>.</li>
    <li>У интерфейсов нельзя объявлять свойства.</li>
    <li>У интерфейсов можно объявлять свойства с помощью ключевого слова &quot;property&quot;.</li>
    <li><s>У интерфейсов можно объявлять свойства так же, как и у классов.</s></li>
  </ul>
  <p>7. Что выведет код?</p>
  <pre>public class A 
{
  private string str = &quot;Hello&quot;;
  public string Str
  {
    set
    {
      str = value;
    }
  }
}
class Program
{
  static void Main(string[] args) 
  {
  A a = new A();
  a.Str = &quot; World&quot;;
  Console.WriteLine(a.Str);
  }
}
</pre>
  <ul>
    <li>Hello;</li>
    <li><strong>ошибка на этапе компиляции;</strong></li>
    <li><s>что-то ещё.</s></li>
  </ul>
  <p><em>P.S. Программа не скомпилируется, т.к. у свойства отсутствует метод для чтения, который необходим при выводе значения свойства в консоль.</em></p>
  <p>8. Какое утверждение неверно?</p>
  <ul>
    <li>Свойства позволяют управлять доступом к переменной.</li>
    <li>В свойства мы можем вложить дополнительную логику.</li>
    <li><strong>В каждом свойстве должны быть get и set блоки.</strong></li>
    <li>Благодаря свойствам, реализуется один из принципов ООП - инкапсуляция.</li>
  </ul>

]]></content:encoded></item></channel></rss>