vbnet控制台应用程序中的系统内存不足异常

时间:2016-02-11 07:25:47

标签: vb.net visual-studio console-application

我正在尝试在codeeval.com中找到一个挑战的解决方案 https://www.codeeval.com/open_challenges/125/

我的代码:

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 gb ram使用,并且在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

1 个答案:

答案 0 :(得分:0)

首先:正如您所做的那样,使用StringBuilder。

您可以通过索引访问字符串中的任何字符,并对其进行更改。所以你必须遍历你的新字符串,检查0,1,2的每个单个字符并根据需要进行更改(这样你就可以避免4个替换调用 - 每个都需要时间)。

第二:正如What is the maximum possible length of a .NET string?所述,长串会遇到麻烦。因此,请考虑将其拆分为多个阵列(每个阵列的大小可能为1百万。

祝你好运。