2013-03-18 83 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