分割数字字符串并查找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;
}
大量使用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;
}