拆分数字字符串和查找总和

时间:2013-03-18 09:39:31

标签: c# algorithm language-agnostic

如何编写一个采用单个参数的方法。单个参数是一个字符串 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;
}

2 个答案:

答案 0 :(得分:1)

使用LINQ的解决方案,希望对您有所帮助。 “技巧”是你必须检查整个字符串的新版本,即第一个int和最后一个的lop。这个问题在此之前已经被问过,但是作为一个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;
}

解决方案就是检查顺序正确,即第一个“解决方案”保证是最长的解决方案。

答案 1 :(得分: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;
}