【发布时间】:2021-08-31 09:47:34
【问题描述】:
好的,这只是我几天前解决的一个有趣问题的一小部分。想象一下,我们有一个包含 N 个元素的数组。该数组仅由 1 和 -1 组成。它看起来像这样:
int[] arr = new int[] { -1, 1, -1, 1, 1, -1 };
我们的任务是找到保持(假想)计数器 >= 0 的连续元素的最大数量(从左到右),然后对数组进行切割,以便只剩下这些元素。
在我们的例子中,我们从计数器 0 开始:
计数器 = 0
第一个元素:-1 -> Counter = -1(低于0,所以我们重置了计数器)
秒:1 -> 计数器 = 1
第三个:-1 -> Counter = 0
第四个:1 -> Counter = 1
等等。
在上述例子中,答案是:
Solve(new int[] { -1, 1, -1, 1, 1, -1 }); // => new int[] { 1, -1, 1, 1, -1 };
现在,我的做法是这样的:
public static List<int> Solve(int[] input)
{
List<List<int>> compare = new List<List<int>>();
List<int> temp = new List<int>();
for(int i = 0, c = 0; i < input.Length; i++)
{
if(input[i] == 1)
{
c++;
temp.Add(input[i]);
}
else if(input[i] == -1)
{
c--;
if (c >= 0)
temp.Add(input[i]);
else
{
c = 0;
compare.Add(temp);
temp = new List<int>();
}
}
}
compare.Add(temp);
return compare.OrderByDescending(x => x.Count).First();
}
更多测试用例:
Solve(new int[] { -1, 1, -1, 1, 1, -1 }); // => new int[] { 1, -1, 1, 1, -1 };
Solve(new int[] { 1, 1, -1, -1, 1, 1 }); // => new int[] { 1, 1, -1, -1, 1, 1 };
Solve(new int[] { 1, -1, 1, -1, 1, -1, -1, 1, 1, 1 }); // => new int[] { 1, -1, 1, -1, 1, -1 };
Solve(new int[] { 1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1, -1 }
// => new int[] { 1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1 };
Solve(new int[] { -1, -1, -1 }); // => new int[] { };
但我对你们所有 Linq 策划者的问题是:有没有什么方法可以在 1 行代码中使用我们心爱的 Linq 来做到这一点?
那将不胜感激:D
【问题讨论】:
-
对于“从右到左”的事情非常抱歉,我可能让你们中的一些人感到困惑。相应地编辑了问题。
-
"consecutive elements..." 在这一点上,我已经知道没有简单的 LINQ 单行。如果您想知道上一个/下一个项目是什么,Linq 并不是真正合适的工具,那是普通 for 循环的域。
-
@TimSchmelter 啊,真可惜,我希望有办法做到这一点。很公平,不过感谢您指出!也许其他人有其他想法?也许是一些晦涩的语言功能?