При запуске всегда разбивайте проблему, которую вы пытаетесь решить, на более мелкие и решайте их. Если вы разделите его достаточно, то проблемы, которые вам действительно придется решать, - это практически один лайнер, который можно легко проверить как правильный.
Что вам нужно? Во-первых, метод, который извлекает последнее di git целого числа. Хорошо, это просто, последний di git любого числа - это остаток от деления на 10
:
private static int ExtractLastDigit(this int i)
{
return i % 10;
}
Нам также нужен метод, который извлекает первое di git. Самый простой способ сделать это - уменьшить число так, чтобы di git, который мы ищем, был единственным оставшимся di git. Мы можем сделать это с помощью Log10:
private static int ExtractFirstDigit(this int i)
{
var scale = (int)Math.Log10(i);
return (int)(i / Math.Pow(10, scale));
}
Теперь существует множество способов сделать это. Самый простой для понимания - создать две коллекции; один со всеми первыми цифрами, а другой со всеми последними цифрами, проверка, все ли элементы из первого присутствуют во втором. Поскольку вы будете усердно искать внутри последнего, если входная коллекция достаточно велика, сохранение последних цифр в поисковой коллекции, как правило, является хорошей идеей. Фреймворк предоставляет такую коллекцию: HashSet<T>
.
Я буду использовать linq, но создание коллекций с использованием классических циклов довольно тривиально.
var firstItems = inputStack.Select(i => i.ExtractFirstDigit());
var lastItems = new HashSet<int>(inputStack.Select(i => i.ExtractLastDigit()))
А теперь с logi c operator All
linq предоставляет:
var validInput = firstItems.All(f => lastItems.Contains(f));
Что примерно соответствует:
var validInput = true;
foreach (var first in firstItems)
{
if (!lastItems.Contains(f))
{
validInput = false;
break;
}
}
И все готово.
Есть ли более эффективные решения? Конечно, но действительно ли они вам нужны? Если ответ положительный, привыкните сначала к созданию рабочего решения, а затем начните попытки оптимизировать его с четкими целями производительности, которые вы можете измерить и протестировать. Если вы этого не сделаете или оно уже соответствует вашим целям, то у вас есть рабочее решение, простое для понимания и поддержки.