分割数字字符串并查找sum

本文关键字:sum 查找 串并 数字字符 分割 | 更新日期: 2023-09-27 18:04:32

如何编写一个方法,它接受一个参数。单个实参是一个字符串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;
}

分割数字字符串并查找sum

大量使用LINQ的解决方案,希望对您有所帮助。"诀窍"在于,您必须检查整个字符串的两个新版本,即删除第一个int和最后一个in。这个问题以前在SO被问过,但是作为一个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;
}

解决方案是按照正确的顺序进行检查,即第一个"解决方案"保证是最长的解决方案。

循环遍历可能的组合。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;
}