Задачка с ревью
Оценить по сложности каждый метод и предложить как улучшить.
C# LINQ-выражения
create table table1 (Id int, ParentId int null)
var table = new [] { new { Id = 1, ParentId = null }, new { Id = 2, ParentId = 1 }, new { Id = 3, ParentId = 2 }, new { Id = 4, ParentId = 2 } );
var answer = table.where(x=> x.ParentId != null && !table.Any(y => y.ParentId == x.Id));
table.ToDictionary(c => c.ParentId)
C# IEnumerable и yield return
class Program
{
static void Main()
{
IEnumerable<int> ienum = null;
try
{
ienum = OddSequence(50, 110);
Console.WriteLine("Retrieved enumerator...");
}
catch(Exception ex)
{
Console.WriteLine("Catch 1");
Console.WriteLine(ex);
}
try
{
foreach (var i in ienum)
{
Console.Write($"{i} ");
}
}
catch(Exception ex)
{
Console.WriteLine("Catch 2");
Console.WriteLine(ex);
}
Console.ReadLine();
}
public static IEnumerable<int> OddSequence(int start, int end)
{
if (start < 0 || start > 99)
throw new ArgumentOutOfRangeException("start must be between 0 and 99.");
if (end > 100)
throw new ArgumentOutOfRangeException("end must be less than or equal to 100.");
if (start > end)
throw new ArgumentException("start must be less than end.");
for (int i = start; i <= end; i++)
{
if (i % 2 == 1)
yield return i;
}
}
}
C# MyStringBuilder
Написан аналог класса StringBuilder, поддерживающий операции:
- Дописать строку в конец текущей строки
- Дописать строку в начало текущей строки
- Вернуть текущую строку
- Вернуть i-й символ текущей строки (без проверки, что аргумент i лежит в нужных пределах)
- Вернуть количество различных символов, встречающихся в текущей строке
Нужно оценить, насколько быстро реализованы эти операции, и предложить возможные пути оптимизации без использования класса StringBuilder.
public class MyStringBuilder
{
private readonly List<char> chars;
public MyStringBuilder()
{
chars = new List<char>();
}
public void AddToEnd(string s)
{
chars.AddRange(s);
}
public void AddToStart(string s)
{
chars.InsertRange(0, s);
}
public override string ToString()
{
var result = "";
foreach (var nextChar in chars)
{
result += nextChar;
}
return result;
}
public char this [int index] => chars[index];
public int GetDifferentCharactersCount()
{
var differentCharacters = new List<char>();
foreach (var c in chars)
{
if (differentCharacters.IndexOf(c) == -1)
{
differentCharacters.Add(c);
}
}
return differentCharacters.Count();
}
}
Задачка на System Design
Делаем распределённую систему генерации отчётов. Юзер нажимает кнопку, по которой должен получить отчёт в виде файла, данные для генерации файла берутся из разных микросервисов.
Вопросы во время проектирования:
- Что будет если какой-то сервис отъебнёт?
- Как юзер узнает на какой стадии отчёт?
- Как избавиться от дубликатов, если юзер будет спамить кнопку?
- Как понять, что юзер забил хуй и ему отчёт не нужен?
К задаче прилагалась схема системы, включающая Frontend, API Gateway, ReportService, RMQ, DataService1, DataService2, FileGeneratorService, а также хранилища статусов и отчетов, и Standalone Monitoring с PostgreSQL.
Вложения



