Я все еще учусь 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();
}
}
}