Как создать функцию, которая оценивает целое число как коллекцию LIFO в C# - PullRequest
5 голосов
/ 03 августа 2020

проблема: напишите функцию (AllExist), которая получает в качестве параметра непустой стек stk (int), который вернет истину, если все первые цифры каждого числа в стеке появятся как последние di git в любом из чисел stk, иначе вернет false. например: для stk (начиная сверху вниз) 122, 251, 565, 12334, 28, 7. функция вернет true. 1, 2, 5 и 7 появляются как последние цифры в любых числах в стеке.

** clone - это функция, которая возвращает стек, идентичный заданному.

мое предложение:

public static bool AllExist(stack<int> stk)
{
  int x=0; int i; int z; bool bl; string str;
  stack <int> stk1=clone (stk);
  while (!stk1.IsEmpty())
  {
    i=stk1.Pop();
    while(i>=10)
    i/=10;
    x=x*10+i;
  }
 str=x.ToString();
 stack<int> stk2=Clone(stk);
 while(!stk2.IsEmpty())
 {
   z=stk2.Pop()%10;
   if (str.IndexOf(z.ToString())>-1)
     bl=true;
   bl=false;
 }
return bl;
}

** это все переводится, извините за недоразумения.

спасибо!

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

При запуске всегда разбивайте проблему, которую вы пытаетесь решить, на более мелкие и решайте их. Если вы разделите его достаточно, то проблемы, которые вам действительно придется решать, - это практически один лайнер, который можно легко проверить как правильный.

Что вам нужно? Во-первых, метод, который извлекает последнее 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;
    }
}

И все готово.

Есть ли более эффективные решения? Конечно, но действительно ли они вам нужны? Если ответ положительный, привыкните сначала к созданию рабочего решения, а затем начните попытки оптимизировать его с четкими целями производительности, которые вы можете измерить и протестировать. Если вы этого не сделаете или оно уже соответствует вашим целям, то у вас есть рабочее решение, простое для понимания и поддержки.

1 голос
/ 03 августа 2020

Вы можете решить эту проблему с помощью LINQ, например:

static void Main(string[] args)
{
     Console.WriteLine(AllExist(new Stack<int>(new List<int>() { 122, 251, 565, 12334, 28, 7 })));
}

public static bool AllExist(Stack<int> stk) => stk.All(
     firstDigitItem => stk.Where(
          lastDigitItem => lastDigitItem.ToString().Last() == firstDigitItem.ToString().First())
     .Count() > 0);
   

Как это работает:

  • Используя stk.All (), вы вернете true, если все элементы в коллекции удовлетворяют условию.
  • Затем мы выбираем один элемент из коллекции - firstDigitItem и начинаем сравнивать первый di git этого элемента с каждым последним di git элементом в коллекции. Использование .ToString (). First () или .ToString (). Last ()
  • Если нашему условию удовлетворяет более 0 элементов - мы продолжаем проверять другие элементы.
  • Else: «Где «return false, а« All »автоматически возвращает false.

Или даже более оптимизированным способом:

public static bool AllExist(Stack<int> stk) => stk.All(
     firstDigitItem => 
          stk.Any(lastDigitItem => lastDigitItem.ToString().Last() == firstDigitItem.ToString().First()));

Здесь, используя« Any », мы ищем только первый элемент, который удовлетворяют нашему предикату, а не всем элементам как «Где».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...