Как я могу увеличить скорость последовательности Look and Say? - PullRequest
0 голосов
/ 21 апреля 2020

Я все еще учусь c#, и мне нужно, чтобы мой код выполнялся менее чем за 2 секунды, чтобы быть принятым. Я смотрю и говорю последовательность, и после того, как последнее число найдено, код суммирует все это, и это занимает много времени, если элемент в последовательности большой.

Пример: вход: 2 Выход: принимает менее секунды Вход: 50 Выход: занимает около 4 секунд.

Я только попытался сделать, это заменить циклы foreach на циклы for. Я не знаю, что еще изменить. Кто-нибудь может указать мне правильное направление? Спасибо всем.

namespace SumOfLookAndSaySequence
{
    class Program
    {

        static void Main(string[] args)
        {
            string input = Console.ReadLine();

            if (Int32.TryParse(input, out int nthTerm) && nthTerm > 0)
            {
                string lastSequence = GetSequence(nthTerm).Last();
                char[] digits = lastSequence.ToCharArray();
                int[] itemToSum = new int[digits.Length];
                int result = 0;
                for(int i = 0; i < digits.Length; i++)
                {
                    itemToSum[i] = int.Parse(digits[i].ToString());
                    result = result + itemToSum[i];
                }
                Console.WriteLine(lastSequence);
                Console.WriteLine(result);
            }

        }

        static IEnumerable<string> GetSequence(int nthTerm)
        {
            List<string> sequence = new List<string>() { "1" };

            for(int i = 1; i < nthTerm; i++)
            {
                sequence.Add(GetNextNumberSequence(sequence[i - 1]));
            }

            return sequence;
        }

        static string GetNextNumberSequence(string number)
        {
            StringBuilder stringBuilder = new StringBuilder();

            int count = 1;
            char digit = number[0];

            for(int i = 1; i < number.Length; i++)
            {
                if(number[i] == digit)
                {
                    count++;
                }
                else
                {
                    stringBuilder.Append(string.Concat(count, Char.GetNumericValue(digit)));

                    count = 1;
                    digit = number[i];
                }
            }

            stringBuilder.Append(string.Concat(count, digit));

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