<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[UniLecs - Medium]]></title>
        <description><![CDATA[Задачи по алгоритмизации и программированию, а также новости из мира IT. - Medium]]></description>
        <link>https://medium.com/unilecs?source=rss----75306b0f76f2---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>UniLecs - Medium</title>
            <link>https://medium.com/unilecs?source=rss----75306b0f76f2---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Mon, 25 May 2026 22:39:26 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/unilecs" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Validate IP address]]></title>
            <link>https://medium.com/unilecs/validate-ip-address-fa810f599002?source=rss----75306b0f76f2---4</link>
            <guid isPermaLink="false">https://medium.com/p/fa810f599002</guid>
            <category><![CDATA[unilecs]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[csharp]]></category>
            <category><![CDATA[parsing]]></category>
            <dc:creator><![CDATA[Albert Davletov]]></dc:creator>
            <pubDate>Thu, 04 Nov 2021 23:13:44 GMT</pubDate>
            <atom:updated>2021-11-04T23:13:19.081Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*B8EKhB0ReMS0quueFItsxw.jpeg" /></figure><p><strong>Задача</strong>: для заданной строки верните:</p><ul><li><strong>“IPv4”</strong>, если строка является валидным Ipv4 адресом.</li><li><strong>“IPv6”</strong>, если строка является валидным Ipv6 адресом.</li><li><strong>“Error”</strong>, если не является валидным IP-адресом любого типа.</li></ul><p><strong>Входные данные:</strong> str — исходная строка содержит только символы английского алфавита, цифры, а также символы<em> ‘.’, ‘:’</em></p><p><strong>Справка:</strong></p><ul><li>IPv4-адрес — это IP-адрес в формате «x1.x2.x3.x4», где 0 &lt;= xi &lt;= 255 и xi не может содержать начальные нули.</li><li>IPv6-адрес — это IP-адрес в форме «x1:x2:x3:x4:x5:x6:x7:x8», где 1 &lt;= xi.length &lt;= 4, xi — это шестнадцатеричная строка, которая может содержать цифры, строчные английские буквы (от «a» до «f») и заглавные английские буквы (от «A» до «F»). В xi разрешены ведущие нули.</li></ul><p><strong>Примеры:</strong></p><ol><li>«192.168.1.1»<br><em>Output</em>: “IPv4”</li><li>«192.168.01.1»<br><em>Output</em>: “Error”</li><li>«2001:0db8:85a3:0000:0000:8a2e:0370:7334»<br><em>Output</em>: “IPv6”</li><li>«2001:0db8:85a3::8A2E:037j:7334&quot;<br><em>Output</em>: “Error”</li></ol><h3>Разбор</h3><blockquote>Применяем принцип разделяй и властвуй:</blockquote><ol><li>Разбиваем строку на блоки, разделенные символами ‘.’ или ‘:’.</li><li>Если кол-во блоков равно 4 -&gt; используем функцию для валидации IPv4.</li><li>Если кол-во блоков равно 8 -&gt; используем функцию для валидации IPv6.</li><li>В противном случае, сразу возвращаем сообщение об ошибке.</li></ol><p><strong><em>Функция для валидациия IPv4:</em></strong></p><ul><li>Каждый из 4х блоков проверяем на валидность.</li><li>Каждый блок должен быть не меньше 1 и не больше 3х символов.</li><li>Каждый блок должен быть числом от 0 до 255, а также не должно быть начальных нулей.</li></ul><p><strong><em>Функция для валидации IPv6:</em></strong></p><ul><li>Каждый из 8 блоков проверяем на валидность.</li><li>Размер каждого блока должен быть не меньше 1 и не больше 4х символов.</li><li>Каждый блок может содержать цифры [0–9] или буквы [a-f, A-F].</li></ul><h3>Реализация</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*e1i024BC9_Gm7rsa2UCs7w.png" /><figcaption>C#</figcaption></figure><p>Весь код тут:<br><a href="https://gist.github.com/unilecs/90d9b8a6dd3e4d3041caa60b0b19dad9">https://gist.github.com/unilecs/90d9b8a6dd3e4d3041caa60b0b19dad9</a></p><h4>Play-test</h4><p><a href="https://dotnetfiddle.net/ONaJxK">https://dotnetfiddle.net/ONaJxK</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fa810f599002" width="1" height="1" alt=""><hr><p><a href="https://medium.com/unilecs/validate-ip-address-fa810f599002">Validate IP address</a> was originally published in <a href="https://medium.com/unilecs">UniLecs</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Damaged pixels]]></title>
            <link>https://medium.com/unilecs/damaged-pixels-b572ccb40944?source=rss----75306b0f76f2---4</link>
            <guid isPermaLink="false">https://medium.com/p/b572ccb40944</guid>
            <category><![CDATA[unilecs]]></category>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[csharp]]></category>
            <category><![CDATA[dfs]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Albert Davletov]]></dc:creator>
            <pubDate>Thu, 28 Oct 2021 03:13:26 GMT</pubDate>
            <atom:updated>2021-10-28T03:13:12.713Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1003/1*icU_zKnb_g7HqSFreeqitQ.jpeg" /></figure><p><strong>Задача:</strong> Находим блок поврежденных пикселей. Вам дана матрица пикселей, где ‘0’ представляет рабочий пиксель, а ‘1’ представляет поврежденный пиксель.</p><ul><li>Поврежденные пиксели связаны (т.е. есть только одна поврежденная область на матрице). Пиксели соединены по горизонтали и вертикали.</li><li>Также вам даны два целых числа x и y, которые представляют расположение одного из поврежденных пикселей.</li></ul><p>Необходимо найти площадь наименьшего <em>(выровненного по оси)</em> прямоугольника, охватывающего все поврежденные пиксели.</p><p><strong>Входные данные: </strong>Стороны матрицы имеют размер от 1 до 100 пикселей включительно. Элементы матрицы символы ‘0’, ‘1’.</p><p><strong>Вывод:</strong> площадь наименьшего прямоугольника, охватывающего все поврежденные пиксели.</p><p><strong>Пример</strong>:</p><p>matrix = [</p><p>[‘0’,’0&#39;,’1&#39;,’0&#39;],</p><p>[‘0’,’1&#39;,’1&#39;,’0&#39;],</p><p>[‘0’,’1&#39;,’0&#39;,’0&#39;]</p><p>].</p><p>x = 0, y = 2</p><p><em>Output</em>: 6</p><h3>Разбор</h3><blockquote>Классический подход в подобных задачах — использование <a href="https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%B2_%D0%B3%D0%BB%D1%83%D0%B1%D0%B8%D0%BD%D1%83">поиска в глубину (Depth-first search, DFS)</a>.</blockquote><p>То есть из каждой текущего пикселя матрицы мы запускаем поиск вглубь матрицы до тех пор, пока встречаются поврежденные пиксели. И для каждой из сторон мы сохраним крайние координаты поврежденных пикселей. Таким образом, мы сможем определить длину поврежденной области по оси X и оси Y, и найдем площадь поврежденной области.</p><p><strong>Детали реализации:</strong></p><ul><li>Eсли исходная задача позволяет изменять исходные данные, в нашем случае, это матрица, то для того, чтобы алгоритм не считал уже пройденные элементы, мы можем изменить значение поврежденного пикселя.</li><li>Если вы не хотите изменять исходные данные, то обычно используется вспомогательный массив посещенных координат visited. Таким образом на каждом шаге поиска в глубину, вы пропускаете уже пройденные элементы.</li></ul><p>В нашем случае, мы можем изменить исходные данные, поэтому для простоты воспользуемся 1м вариантом.</p><h3>Реализация</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hJC59LjxvY5oTUF6viHP3g.png" /><figcaption>C#</figcaption></figure><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b29aafddd2af0f5b6fc134cba0123e2a/href">https://medium.com/media/b29aafddd2af0f5b6fc134cba0123e2a/href</a></iframe><h4>Play-test</h4><p><a href="https://dotnetfiddle.net/sRMdAC">https://dotnetfiddle.net/sRMdAC</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b572ccb40944" width="1" height="1" alt=""><hr><p><a href="https://medium.com/unilecs/damaged-pixels-b572ccb40944">Damaged pixels</a> was originally published in <a href="https://medium.com/unilecs">UniLecs</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[One-row keyboard]]></title>
            <link>https://medium.com/unilecs/one-row-keyboard-d010d5d08a6f?source=rss----75306b0f76f2---4</link>
            <guid isPermaLink="false">https://medium.com/p/d010d5d08a6f</guid>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Albert Davletov]]></dc:creator>
            <pubDate>Fri, 22 Oct 2021 03:26:14 GMT</pubDate>
            <atom:updated>2021-10-22T03:26:02.201Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UtnVUtKknR49LT6PmTrAkw.png" /></figure><p><strong>Задача</strong>: вам дана специальная клавиатура, все клавиши которой размещены в один ряд. Ряд длиной в 26 символов. <br>Изначально ваш курсор находится в индексе 0. Чтобы ввести символ, вы должны переместить курсор в указатель нужного символа. Время, необходимое для перемещения курсора с указателя i на указатель j, равно |i — j|.</p><p>Вы хотите ввести слово. Необходимо рассчитать, сколько времени нужно, чтобы набрать ее.</p><p><strong>Входные данные: </strong>keyboard — строка в 26 символов, все символы — строчные английские буквы; word — слово, которые вам нужно набрать.</p><p><strong>Вывод:</strong> время, которое необходимо, чтобы набрать входное слово курсором.</p><p><strong>Примеры:</strong></p><ol><li>keyboard = “abcdefghijklmnopqrstuvwxyz”, word = “cba”<br><em>Output</em>: 4 <br><em>Пояснение</em>: <br>‘c’: |0–2| = 2; <br>‘b’: |2–1| = 1; <br>‘a’: |1–0| = 1.<br>В сумме получаем 2 + 1 + 1 = 4.</li><li>keyboard = “abcdefghijklmnopqrstuvwxyz”, word = “tag”<br><em>Output</em>: 44 <br><em>Пояснение</em>: <br>‘t’: |0–19| = 19; <br>‘a’: |19–0| = 19; <br>‘g’: |0–6| = 6. <br>В сумме получаем: 19 + 19 + 6 = 44.</li></ol><h3>Разбор</h3><p>Давайте приведем интуитивный алгоритм:</p><ol><li>Сохраним позиции символов нашей клавиатуры. Можно использовать хэш-таблицу или массив длиной 26, т.к. мы используем только строчные буквы английского алфавита — indices[].</li><li>Заводим счетчик текущего курсора pos — он будет указывать на позицию текущего символа для ввода. По умолчанию курсор (счетчик) находится в позици 0.</li><li>Также инициализируем результирующую переменную time = 0.</li><li>Проходим по входному слову, которое необходимо набрать на клавиатуре. На каждой итерации добавляем к time разность по модулю курсора и позицию текущего символа для ввода, т.е. Abs(pos — indices[i]).</li><li>Обновим курсор: теперь он равен indices[i].</li><li>Выводим результат time.</li></ol><p>Детали смотрите ниже!</p><h3>Реализация</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*M3wbGf4wsWF-aHIVOlKC5w.png" /><figcaption>C#</figcaption></figure><p><a href="https://gist.github.com/unilecs/a8a6d42724421836345576dcc0a56162">https://gist.github.com/unilecs/a8a6d42724421836345576dcc0a56162</a></p><h4>Play-test</h4><p><a href="https://dotnetfiddle.net/TU3PVj">https://dotnetfiddle.net/TU3PVj</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d010d5d08a6f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/unilecs/one-row-keyboard-d010d5d08a6f">One-row keyboard</a> was originally published in <a href="https://medium.com/unilecs">UniLecs</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Update License Key Format]]></title>
            <link>https://medium.com/unilecs/update-license-key-format-978727e4d125?source=rss----75306b0f76f2---4</link>
            <guid isPermaLink="false">https://medium.com/p/978727e4d125</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[parse]]></category>
            <category><![CDATA[csharp]]></category>
            <category><![CDATA[unilecs]]></category>
            <category><![CDATA[algorithms]]></category>
            <dc:creator><![CDATA[Albert Davletov]]></dc:creator>
            <pubDate>Fri, 15 Oct 2021 01:39:06 GMT</pubDate>
            <atom:updated>2021-10-15T01:38:52.134Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wnmel_w5KKFaNwwc4awx6g.png" /></figure><p><strong>Задача</strong>: дан лиценизионный ключ, представленный в виде строки S. Строка разделена на N + 1 подгруппу, разделенных N дефисами. Также дано число K.</p><p>Необходимо преобразовать лицензионный ключ таким образом, чтобы каждая подгруппа содержала ровно K символов, за исключением 1й подгруппы, которая может быть короче K символов, но должна содержать хотя бы 1 символ. Также между 2мя любыми группами должно быть вставлен дефис. Все строчные буквы преобразовать в прописные.</p><p><strong>Входные данные:</strong> строка S, состоящая только из букв английского алфавита, цифр и дефисов. K — целое число.</p><p><strong>Вывод:</strong> преобразованная строка.</p><p><strong>Примеры:</strong></p><ol><li>S = “5F3Z-2e-9-w”, K = 4<br><em>Output</em>: “5F3Z-2E9W”</li><li>S = “2–5g-3-J”, K = 2<br><em>Output</em>: “2–5G-3J”</li></ol><h3>Разбор</h3><p>Алгоритм довольно простой: главная особенность решения в том, что мы парсим строку с конца, т.к. по условиям задачи нам необходимо оставить 1й блок с K символов или меньше, смотрите 2й пример.</p><p>Все детали реализации смотрите в коде!</p><h3>Реализация</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Mh_Nz6apoCw98cZ90qz5OQ.png" /><figcaption>C#</figcaption></figure><p><a href="https://gist.github.com/unilecs/587aedf4cb17a00fb0c12d1227c371ee">https://gist.github.com/unilecs/587aedf4cb17a00fb0c12d1227c371ee</a></p><h4>Play-test</h4><p><a href="https://dotnetfiddle.net/4aM7re">https://dotnetfiddle.net/4aM7re</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=978727e4d125" width="1" height="1" alt=""><hr><p><a href="https://medium.com/unilecs/update-license-key-format-978727e4d125">Update License Key Format</a> was originally published in <a href="https://medium.com/unilecs">UniLecs</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Custom Iterator]]></title>
            <link>https://medium.com/unilecs/custom-iterator-68ab7d81a091?source=rss----75306b0f76f2---4</link>
            <guid isPermaLink="false">https://medium.com/p/68ab7d81a091</guid>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[unilecs]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[iterators]]></category>
            <category><![CDATA[csharp]]></category>
            <dc:creator><![CDATA[Albert Davletov]]></dc:creator>
            <pubDate>Thu, 07 Oct 2021 19:36:40 GMT</pubDate>
            <atom:updated>2021-10-07T19:36:23.966Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-KjEhfynUY-Vt_EFXUG_ug.png" /></figure><p><strong>Задача: </strong>дан вложенный список целых чисел NestedList:</p><ul><li>каждый элемент представляет собой целое число или список, элементы которого также могут быть целыми числами или другими списками.</li></ul><p>Необходимо реализовать итератор CustomIterator:</p><p>класс CustomIterator:</p><ul><li>CustomIterator(List&lt;NestedInteger&gt; nestedList) — конструктор, ктр инициализирует итератор вложенным списком nestedList.</li><li>int Next() — метод класса, ктр возвращает следующее целое число во вложенном списке.</li><li>boolean hasNext() — метод, ктр возвращает true, если во вложенном списке все еще есть целые числа, и false в противном случае.</li></ul><p><strong>Примеры:</strong></p><ol><li>NestedList = [[1, 1], 2, [1, 1]]<br><em>Output</em>: [1, 1, 2, 1, 1]</li><li>NestedList = [1, [4, [6]]]<br><em>Output</em>: [1, 4, 6]</li></ol><h3>Разбор</h3><blockquote>Самый простой способ решить эту задачу — это превратить вложенный список в обычный одномерный список. Как это сделать?!</blockquote><p>Можно воспользоваться рекурсией: будем проходит по вложенному списку и добавлять в результирущий массив элемент, если это простое число, если же мы встретили вложенный список, то вызываем рекурсию с этим списком.</p><p>Таким образом по окончанию основного цикла в результирующем массиве мы получим все элементы, порядок элементов также сохраниться, т.к. мы проходим слева направо.</p><p><em>Далее все просто:</em> мы просто заведем глобальную переменную, которая будет следить за позицией текущего элемента в итераторе. Эту переменную используем в методах HasNext и Next.</p><p>Детали реализации смотрите в коде!</p><h3>Реализация</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Us45iQRLXAwf951DRZyn0g.png" /><figcaption>C#</figcaption></figure><p><a href="https://gist.github.com/unilecs/669e9ee2fcdd8c1d8d719d8d1bd8bbce">https://gist.github.com/unilecs/669e9ee2fcdd8c1d8d719d8d1bd8bbce</a></p><h4>Play-test</h4><p><a href="https://dotnetfiddle.net/GKEGUo">https://dotnetfiddle.net/GKEGUo</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=68ab7d81a091" width="1" height="1" alt=""><hr><p><a href="https://medium.com/unilecs/custom-iterator-68ab7d81a091">Custom Iterator</a> was originally published in <a href="https://medium.com/unilecs">UniLecs</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Long pressed string]]></title>
            <link>https://medium.com/unilecs/long-pressed-string-ae4f4e8dae01?source=rss----75306b0f76f2---4</link>
            <guid isPermaLink="false">https://medium.com/p/ae4f4e8dae01</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[unilecs]]></category>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[two-pointers]]></category>
            <category><![CDATA[csharp]]></category>
            <dc:creator><![CDATA[Albert Davletov]]></dc:creator>
            <pubDate>Fri, 01 Oct 2021 00:50:16 GMT</pubDate>
            <atom:updated>2021-10-01T00:50:00.191Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iH_I2r7BU_EPVvke5YvRjQ.png" /></figure><p><strong>Задача</strong>: вы набираете имя на клавиатуре, которая иногда залипает и выводит символ несколько раз.</p><p>Необходимо проверить набранное имя с оригинальным и вернуть true, если возможно, что это было оригинальное имя, но с залипанием некоторых символов (возможно, было 0 залипаний), false — в противном случае.</p><p><strong>Входные данные:</strong> origin — оригинальное имя, typed — набранное имя на клавиатуре. Обе строки содержат только прописные буквы английского алфавита: [‘a’,…,’z’].</p><p><strong>Вывод:</strong> true/false</p><p><strong>Примеры:</strong></p><ol><li>Origin: “albert”, <br>Typed: “albert”<br><em>Output</em>: true</li><li>Origin: “albert”, <br>Typed: “aaalberrt”<br><em>Output</em>: true (“залипли” символы ‘a’ и ‘r’)</li><li>Origin: “lee”, <br>Typed: “lle”<br><em>Output</em>: false (оригинальное имя содержит 2 символа ‘e’)</li></ol><h3>Разбор</h3><p>Эта задачу довольно легко можно решить за 3 прохода:</p><ul><li>сначала мы собираем информацию формата символ -&gt; количество послед.вхождений для обоих строк (origin, typed);</li><li>затем проходим и сравниваем элементы такой коллекции. Если мы встретили отличный символ или символ в набранной строке, у ктр кол-во послед.вхождений меньше, чем в оригинальной строке, то сразу выводим false.</li></ul><p>Однако мы можем оптимизировать алгоритм как по времени, так и по памяти. <strong>Воспользуемся методом двух указателей:</strong> 1й указатель будет идти по оригинальной строке, 2й по набранной.</p><p>А идея довольно простая: на каждой итерации, мы будем проверять, равны ли текущие символы в строках.</p><ul><li>eсли да, то мы увеличиваем оба указателя;</li><li>в противном случае мы предполагаем, что мы встретили символ, ктр ‘залип’, т.е. текущий набранный символ должен быть равен предыдущему. Если же и эта проверка не пройдена, то мы смело выводим false.</li></ul><p>Смотрите детали реализации методом 2х указателей ниже!</p><h3>Реализация</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*g95rkSNQ8sbbvODM4Wbnxg.png" /><figcaption>C#</figcaption></figure><p><strong>Код с комментариями!<br></strong><a href="https://gist.github.com/unilecs/e13c78b00563a4ddef89cf1faa140c0f">https://gist.github.com/unilecs/e13c78b00563a4ddef89cf1faa140c0f</a></p><h4>Play-test</h4><p><a href="https://dotnetfiddle.net/Fpe4R4">https://dotnetfiddle.net/Fpe4R4</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ae4f4e8dae01" width="1" height="1" alt=""><hr><p><a href="https://medium.com/unilecs/long-pressed-string-ae4f4e8dae01">Long pressed string</a> was originally published in <a href="https://medium.com/unilecs">UniLecs</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Максимальное среднее значение бинарного поддерева]]></title>
            <link>https://medium.com/unilecs/%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B5%D0%B5-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0-bd8dbc0e12f1?source=rss----75306b0f76f2---4</link>
            <guid isPermaLink="false">https://medium.com/p/bd8dbc0e12f1</guid>
            <category><![CDATA[dfs]]></category>
            <category><![CDATA[unilecs]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[binary-tree]]></category>
            <dc:creator><![CDATA[Albert Davletov]]></dc:creator>
            <pubDate>Fri, 24 Sep 2021 02:37:56 GMT</pubDate>
            <atom:updated>2021-09-24T02:37:44.565Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ECIs5n7YAh-HmUCAZelN1w.png" /></figure><p><strong>Задача</strong>: дано бинарное дерево, необходимо написать алгоритм, который вернет максимальное среднее значение поддерева.</p><p><strong>Справка:</strong></p><ul><li>Поддерево — это любой узел этого дерева плюс всего его потомки.</li><li>Среднее значение дерева — это сумма его значений, деленная на количество узлов.</li></ul><p><strong>Входные данные:</strong> root — корень бинарного дерева</p><p><strong>Вывод: </strong>максимальное среднее значение поддерева.</p><p><strong>Примеры:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/175/0*Yz2WHZeS0SMcG50I.png" /></figure><p><strong><em>Output</em></strong>: 6</p><p>Пояснение: Max[</p><ul><li>(5 + 6 + 1) / 3 = 4</li><li>6 / 1 = 6</li><li>1 / 1 = 1</li></ul><p>] = 6</p><h3>Разбор</h3><p>Воспользуемся методом поиска в глубину (DFS). Для каждого узла мы рекурсивно запустим поиск в глубину и найдем кол-во дочерних узлов слева и справа, а также сумму этих значений. Далее определим среднее значение для текущего узла и сравним с результирующим максимальным значением.</p><p>Рекурсивная подфункция будет возвращать массив, где 1й элемент — это кол-во дочерних узлов, а 2й элемент — сумма значений дочерних узлов.</p><p>Детали реализации смотрите ниже.</p><h3>Реализация</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6blF0vEHkJcsN-yJScknxA.png" /><figcaption>C#</figcaption></figure><p><a href="https://gist.github.com/unilecs/b7c21026a06afbb556188b59f494866e">https://gist.github.com/unilecs/b7c21026a06afbb556188b59f494866e</a></p><h4>Play-test</h4><p><a href="https://dotnetfiddle.net/lf7r7B">https://dotnetfiddle.net/lf7r7B</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bd8dbc0e12f1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/unilecs/%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5-%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B5%D0%B5-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0-bd8dbc0e12f1">Максимальное среднее значение бинарного поддерева</a> was originally published in <a href="https://medium.com/unilecs">UniLecs</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Морской бой]]></title>
            <link>https://medium.com/unilecs/%D0%BC%D0%BE%D1%80%D1%81%D0%BA%D0%BE%D0%B9-%D0%B1%D0%BE%D0%B9-9109dafcbc5?source=rss----75306b0f76f2---4</link>
            <guid isPermaLink="false">https://medium.com/p/9109dafcbc5</guid>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[battleships]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[csharp]]></category>
            <category><![CDATA[unilecs]]></category>
            <dc:creator><![CDATA[Albert Davletov]]></dc:creator>
            <pubDate>Fri, 17 Sep 2021 04:27:14 GMT</pubDate>
            <atom:updated>2021-09-17T04:27:02.068Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3QiqKwq2FocdiDyUdHlWlA.png" /></figure><p><strong>Задача</strong>: дано игровое поле, которое задано матрицей m x n, где каждая ячейка представляет собой клетку корабля «X» или пустую клетку «.».</p><p>Необходимо найти количество всех кораблей на игровом поле.</p><p><strong>Примечание:</strong> корабли можно размещать на игровом поле только горизонтально или вертикально. Также по крайней мере, 1 горизонтальная или вертикальная клетка разделяет два корабля.</p><p><strong>Входные данные: </strong>board — символьная матрица, содержащая символы ‘.’, ‘X’. Размер сторон матрицы от 1 до 100.</p><p><strong>Вывод</strong>: количество всех кораблей</p><p><strong>Пример:</strong></p><p>Board = [</p><p>[‘X’, ‘.’, ‘.’, ‘X’],</p><p>[‘.’, ‘.’, ‘.’, ‘X’],</p><p>[‘.’, ‘.’, ‘.’, ‘X’]]</p><p><em>Output</em>: 2</p><h3>Разбор</h3><p>Первый способ решения — это запустить поиск в глубину (DFS), пометить посещенные клетки корабля и посчитать общее количество кораблей. Поиск в глубину довольно дорогой метод по времени, также он использует рекурсию.</p><p>Чтобы избежать этого, мы можем оптимизировать наш алгоритм, используя тот, факт, что корабли могут распологаться только по горизонтали или только по вертикали. Т.е. нам нужно посчитать только первые клетки кораблей.</p><p>Если на очередном шаге мы встретили клетку корабля, мы проверяем предыдущую клетку по вертикали и по горизонатли, если там также находится клетка корабля, то мы пропускаем эту итерацию. Так как мы уже посчитали этот корабль раньше.</p><p>Если же на очередном шаге мы встретили клетку корабля и предыдушие клетки по горизонтали и вертикали не являются клетками корабля, то значит мы нашли 1ю клетку нового корабля. В этом случае увеличиваем наш результирующий счетчик.</p><p>Детали смотрите в коде.</p><h3>Реализация</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KsL5J9ctWbgBAqGPoR7L6A.png" /><figcaption>C#</figcaption></figure><p><a href="https://gist.github.com/unilecs/1d63a9881b198e059eee7d7b72539399">https://gist.github.com/unilecs/1d63a9881b198e059eee7d7b72539399</a></p><h4>Play-test</h4><p><a href="https://dotnetfiddle.net/s8z4UR">https://dotnetfiddle.net/s8z4UR</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9109dafcbc5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/unilecs/%D0%BC%D0%BE%D1%80%D1%81%D0%BA%D0%BE%D0%B9-%D0%B1%D0%BE%D0%B9-9109dafcbc5">Морской бой</a> was originally published in <a href="https://medium.com/unilecs">UniLecs</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Get Lonely Binary Nodes]]></title>
            <link>https://medium.com/unilecs/get-lonely-binary-nodes-b6acda361183?source=rss----75306b0f76f2---4</link>
            <guid isPermaLink="false">https://medium.com/p/b6acda361183</guid>
            <category><![CDATA[binary-tree]]></category>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[unilecs]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[binary-tree-traversal]]></category>
            <dc:creator><![CDATA[Albert Davletov]]></dc:creator>
            <pubDate>Fri, 10 Sep 2021 00:32:08 GMT</pubDate>
            <atom:updated>2021-09-10T00:31:39.147Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OpLB3mcLxiwgRCM1MHT9aQ.png" /></figure><blockquote>Дадим определение <strong>“одинокого узла” в двоичном дереве</strong>. Это узел, который является единственным потомком своего родительского узла. Корень дерева не является одиноким узлом, так как у него нет родительского узла.</blockquote><p><strong>Задача</strong>: вам дано двоичное дерево. Необходимо вернуть массив, содержащий значения всех одиноких узлов в дереве.</p><p><strong>Входные данные:</strong> root — корень двоичного дерева.</p><p><strong>Вывод: </strong>массив значений одиноких узлов.</p><p><strong>Пример</strong>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*GWMa42cp1Nd0Jl0rPsUXWg.png" /><figcaption><em>Output</em>: [9, 4]</figcaption></figure><p><em>Output</em>: [9, 4]</p><h3>Разбор</h3><p>Рекурсивно пройдем по двоичному дереву: для каждого узла проверим условие для одинокого узла, т.е. только один из потомков (правый или левый) должен отсутствовать. Если это условие выполняется, записываем значение единственного потомка в результирующий список. <br>Продолжаем рекурсивный поиск для следующих узлов.</p><h3>Реализация</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iu638JEzidBm7-xIlutcnQ.png" /><figcaption>C#</figcaption></figure><p><a href="https://gist.github.com/unilecs/0a8aac8308c1dce726bf65afc0c6f449">https://gist.github.com/unilecs/0a8aac8308c1dce726bf65afc0c6f449</a></p><h4>Play-test</h4><p><a href="https://dotnetfiddle.net/dcFTsv">https://dotnetfiddle.net/dcFTsv</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b6acda361183" width="1" height="1" alt=""><hr><p><a href="https://medium.com/unilecs/get-lonely-binary-nodes-b6acda361183">Get Lonely Binary Nodes</a> was originally published in <a href="https://medium.com/unilecs">UniLecs</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Convert column number to Excel title]]></title>
            <link>https://medium.com/unilecs/convert-column-number-to-excel-title-3a6da7382cc?source=rss----75306b0f76f2---4</link>
            <guid isPermaLink="false">https://medium.com/p/3a6da7382cc</guid>
            <category><![CDATA[csharp]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[unilecs]]></category>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[excel]]></category>
            <dc:creator><![CDATA[Albert Davletov]]></dc:creator>
            <pubDate>Fri, 03 Sep 2021 01:20:02 GMT</pubDate>
            <atom:updated>2021-09-03T01:19:20.654Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/496/1*2rMfRn6QSB9BeMzNrXyivQ.jpeg" /></figure><p><strong>Задача:</strong> Необходимо вернуть заголовок столбца в Excel по порядковому номеру N.</p><p>A -&gt; 1</p><p>B -&gt; 2</p><p>C -&gt; 3</p><p>…</p><p>Z -&gt; 26</p><p>AA -&gt; 27</p><p>AB -&gt; 28</p><p>…</p><p><strong>Входные данные:</strong> N — целое число от 1 до 2³¹ — 1.</p><p><strong>Вывод: </strong>заголовок столбца в Excel</p><p><strong>Примеры:</strong></p><ol><li>N = 1<br><em>Output</em>: “A”</li><li>N = 28<br><em>Output</em>: “AB”</li><li>N = 701<br><em>Output</em>: “ZY”</li></ol><h3>Разбор</h3><p>Для простоты разберем на простом примере. Мы знаем, что номер столбца для столбца “ABZ” закодирован по следующей формуле:</p><blockquote>N = A * 26² + B * 26¹ + Z * 26⁰<br>N = A * 26² + B * 26¹ + Z</blockquote><p>Чтобы получить символ Z нам нужно взять остаток от деления на 26:<br>N % 26 = Z<br>Далее мы делим N на 26, тем самым мы двигаемся к следующему символу (B) и повторяем процесс. Таким образом мы получим все символы столбца под номером N.</p><p>В реализации стоит учесть, что в Excel нумерация столбцов идет от 1, в коде же нумерация смиволов A-Z будет начинаться с 0. Поэтому перед началом каждой итерации, мы уменьшаем текущий номер на 1.</p><p>Детали реализации смотрите ниже.</p><h3>Реализация</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yEypSyxkeCXcmU_i_4t-vQ.png" /><figcaption>C#</figcaption></figure><p><a href="https://gist.github.com/unilecs/9816810892bda78415466dcb8b154a97">https://gist.github.com/unilecs/9816810892bda78415466dcb8b154a97</a></p><h4>Play-test</h4><p><a href="https://dotnetfiddle.net/jYKn7A">https://dotnetfiddle.net/jYKn7A</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3a6da7382cc" width="1" height="1" alt=""><hr><p><a href="https://medium.com/unilecs/convert-column-number-to-excel-title-3a6da7382cc">Convert column number to Excel title</a> was originally published in <a href="https://medium.com/unilecs">UniLecs</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>