2013-03-18 43 views
-1

如何编写一个方法,该方法只接受一个参数。单个参数是一个字符串s,它只包含非零数字。拆分数字串和查找总和

该函数应该打印S的最长连续子串的长度,使得该串的长度是2 * N数字(字符串的最大长度为49)的最左N个数位之和等于到最右边N个数字的总和。如果没有这样的字符串,你的函数应该打印0

我是学习c#的人。我看到了这个难题,但没有做到。

样品输入:123231和期望输出是6

说明:

1 + 2 + 3 = 2 + 3 + 1。 最长子串= 6的长度,其中第一半的总和=第二半

样品输入#2:986561517416921217551395112859219257312输出是36

static int myMethod(string s) { 

var input = "123231"; 
bool expected = 
new System.Text.RegularExpressions.Regex("^[1-9]+$").IsMatch(input); 

return 0; 
} 
+1

为什么'c#','java'和'asp.net',全部3在一起? +你到现在为止尝试过什么? – SudoRahul 2013-03-18 09:40:25

+0

你正在学习很棒,请格式化你的计算。另外,你尝试过什么方法?他们在哪里失败? – 2013-03-18 09:40:40

+0

@ R.J接受任何语言。只是一个逻辑 – Billa 2013-03-18 09:40:55

回答

1

使用LINQ了很多解决办法,希望可以帮助您。这个“诀窍”是你必须检查整个字符串的新版本,即第一个int和最后一个int的新版本。这个问题在此之前已经被问过了,但是作为一个C++问题。它看起来在C#漂亮了很多:)

int GetSumString(string s) 
{ 
    // Convert everything to int[], easier that way in .NET 
    var numbersOrg = s.Select(t => int.Parse(t.ToString())).ToArray(); 

    // Its possible to optimize by using ienumerable and lazy evaluation i guess, but I'm lazy :) 
    var queue = new Queue<int[]>(); 
    queue.Enqueue(numbersOrg); 

    while (queue.Any()) 
    { 
     var numbers = queue.Dequeue(); 

     var firstHalf = numbers.Take(numbers.Length/2).Sum(); 
     var secondHalf = numbers.Skip(numbers.Length/2).Sum(); 
     // It must be of even length (% 2) and the sum of the first half must be equal to the last half. 
     if (numbers.Length % 2 == 0 && firstHalf == secondHalf) 
      return numbers.Length; 

     // Console.WriteLine("tried: " + string.Join("", numbers) + " gave (" + firstHalf + "," + secondHalf + ")"); 
     // Only enqueue when we have something left in the array 
     if (numbers.Length > 1) 
     { 
      queue.Enqueue(numbers.Take(numbers.Length - 1).ToArray()); 
      queue.Enqueue(numbers.Skip(1).ToArray()); 
     } 
    } 
    return 0; 
} 

的解决方案是这样是做了检查,以正确的顺序,即第一个“解决方案”的保证下,是最长的解决方案。

+0

不错。我曾经要求在.Net 1.0框架中做到这一点:( – Billa 2013-03-18 10:23:10

+1

@BadDeveloper在.NET 1.0中是否有这样的理由?请看一下这个问题:http: //stackoverflow.com/questions/8469407/to-find-the-longest-substring-with-equal-sum-in-left-and-right-in-c,因为那个比我的答案更接近.NET 1.0。 – flindeberg 2013-03-18 10:45:02

+0

@BadDeveloper你被要求使用'.net 1.0'来做这个?为什么会这样?*只是要求兴趣* – 2013-03-18 10:45:11

0

通过可能只是环组合。例如,用于123231字符串:

1=2   -> fail 
1+2=3+2  -> fail 
1+2+3=2+3+1 -> len=6, longest so far 
2=3   -> fail 
2+3=2+3  -> len=4, not longer 
3=2   -> fail 
3+2=3+1  -> fail 
2=3   -> fail 
3=1   -> fail 

事情是这样的:

int longest = 0; 
for (int i = 0; i < str.Length; i++) { 
    for (j = longest + 1; i + j * 2 <= str.Length; j++) { 
    if (sum(str, i, j) == sum(str, i + j, j)) { 
     longest = j; 
    } 
    } 
} 

int sum(string str, int offset, int len) { 
    int s = 0; 
    for (int i = 0; i < len; i++) s += (int)(str[offset + i] - '0'); 
    return s; 
} 
+0

你能帮我循环你的逻辑与C#。 :( – Billa 2013-03-18 09:53:43

+0

@BadDeveloper:我在上面添加了一些代码 – Guffa 2013-03-18 10:48:52

+0

它给出了输出2而不是6 :( – Billa 2013-03-18 10:52:52