2016-02-11 2 views
2

Я пытаюсь найти решение в Challange в codeeval.com https://www.codeeval.com/open_challenges/125/система из исключения памяти в vbnet Console Application

мой код:

Dim seq As String = "0" 
Dim tmp As String 
For i As Integer = 1 To 31 
    tmp = seq 
    tmp = tmp.Replace("2", "3") 
    tmp = tmp.Replace("1", "2") 
    tmp = tmp.Replace("0", "1") 
    tmp = tmp.Replace("3", "0") 
    seq &= tmp 
Next 
Console.WriteLine(seq) 

После 20 циклов Visual Studio достигает 1,5 Гб оперативной памяти использование и не работает после 25 циклов. Можете ли вы рассказать мне, как это исправить?

Отредактировано:

Длина конечной строки должен быть 3000000000 долго. Вот почему я написал цикл. В 10 циклах длина строки составляет всего 1024. Я должен, вероятно, написать петли цикла 31, которые будут иметь длину 4294967296 (2^31).

Мой новый код:

Dim seq As StringBuilder = New StringBuilder() 
Dim tmp As StringBuilder = New StringBuilder() 
seq.Append("0") 
For i As Integer = 1 To 30 
    tmp.Append(seq) 
    seq.Replace("2", "3") 
    seq.Replace("1", "2") 
    seq.Replace("0", "1") 
    seq.Replace("3", "0") 
    tmp.Append(seq) 
    seq.Clear() 
    seq.Append(tmp) 
Next 
+0

Ваша строка удваивается каждый цикл. Таким образом, ваша строка становится очень большой. Кто вам сказал, что вы должны сделать 30 циклов ? – etalon11

+0

Поскольку строки неизменяемы, вы создаете новый строковый объект с каждым '.Replace'. Кроме того, вы создаете новую строку при конкатенации с' & = '. Вместо этого используйте' StringBuilder'. С '.Append' вы можете добавить вас chars. У него также есть функция '.Replace'. После цикла напишите строку с помощью' stringBuilder.ToString' –

ответ

0

Первый: Как вы уже сделали, использовать StringBuilder.

Вы можете получить доступ к любому символу в своей строке по индексу и ИЗМЕНИТЬ его. Таким образом, вам придется перебирать новую строку, проверять каждый отдельный символ на 0,1,2 и изменять его по мере необходимости (чтобы избежать 4 замены вызовов - каждому нужно время).

Во-вторых: Как указано здесь What is the maximum possible length of a .NET string?, у вас возникнут проблемы с длинными строками. Так считают разделить его на нескольких массивов (каждый из них может быть, 1 миллион в размере.

Успехов.

Смежные вопросы