-1

単一の引数を取るメソッドを作成するにはどうすればよいですか。単一の引数は文字列sで、ゼロ以外の数字のみが含まれます。

この関数は、部分文字列の長さが2*N桁 (文字列の最大長は 49) で、左端の N 桁の合計が右端の N 桁の合計と等しくなるように、s の最長の連続した部分文字列の長さを出力する必要があります。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;
}
4

2 に答える 2

1

LINQ を多用したソリューションです。お役に立てば幸いです。「トリック」は、文字列全体の新しいバージョン、つまり最初の int の lop と最後の int の両方をチェックする必要があることです。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;
}

つまり、最初の「ソリューション」が最も長いソリューションであることが保証されます。

于 2013-03-18T10:10:59.007 に答える
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;
}
于 2013-03-18T09:51:06.897 に答える