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