C# 有没有办法让循环代码更快?
C# 有没有办法让循环代码更快?,c#,C#,int计数=0; 列表计数=新列表(); List goodnumber=新列表(); for(int i=较低;i 调用List.Clear(),而不是在循环中创建新的列表 在循环外部调用count.Max() 删除最后一个if,并在循环count.add(goodnumber.count) int计数=0; 列表计数=新列表(); List goodnumber=新列表(); 对于(inti=lower;i,您可以做一些改进 badNumbers可能应该是一个HashSet,它将为您提供
int计数=0;
列表计数=新列表();
List goodnumber=新列表();
for(int i=较低;i
调用List.Clear()
,而不是在循环中创建新的列表
在循环外部调用count.Max()
count.add(goodnumber.count)
int计数=0;
列表计数=新列表();
List goodnumber=新列表();
对于(inti=lower;i,您可以做一些改进
badNumbers
可能应该是一个HashSet
,它将为您提供接近O(1)的查找
实际上,您并不关心存储“好数字”(您不使用该数据),因此只存储遇到的好数字的数量会更有效
现在,您只需要获得遇到的最大条纹大小(即连续良好数字的最大数量),您可以使用Math.max
将上一次“良好”计数与当前“良好”计数进行比较,并选择最大值
代码如下所示:
HashSet<int> badNumbers = new HashSet<int>() { 5, 4, 2, 15 };
int counts = 0;
int goodNumberCount = 0;
for (int i = lower; i <= upper; i++)
{
if (!badNumbers.Contains(i)) {
++goodNumberCount;
} else {
counts = Math.Max(counts, goodNumberCount);
goodNumberCount = 0;
}
}
counts = Math.Max(counts, goodNumberCount);
return counts;
HashSet badNumbers=newhashset(){5,4,2,15};
整数计数=0;
int goodNumberCount=0;
对于(int i=lower;i而言,“优化”代码的正确方法是重写代码。您需要以不同的方式思考。您遇到的问题有各种不同的解决方案,并且您将其复杂化了太多
您不需要只在一个长周期内处理输入。您可以以某种方式对列表进行预处理,这会对您有所帮助。例如,排序
另一件可以帮助您的事情是有一个变量(或多个变量),您在其中存储一些中间结果。例如,运行max、min、sum或某物的上一个值
想想你如何用数学方法来解决这个问题。这不只是你试图找到的数字的差异吗
您可以对列表进行排序,计算每个元素之间的差异,用上下边框将其绑定。您可以在循环期间更新正在运行的最大差异,也可以从差异列表中找到最大差异。以下是一个通用解决方案:
使用System.Collections.Generic;
使用System.Linq;
名称空间控制台EAPP1
{
班级计划
{
静态void Main(字符串[]参数)
{
var下限=1;
var上限=10;
var elementCount=上限-下限+1;
变量编号=可枚举范围(1,elementCount);
var badNumbers=新哈希集{5,4,2,15};
var maxCount=CalculateCounts(数字、坏数字).Max();
}
私有静态IEnumerable CalculateCounts(IEnumerable项,ISet splitOn)
{
var计数=0;
foreach(项目中的var项目)
{
如果(!splitOn.Contains(item))计数++;
其他的
{
收益回报计数;
计数=0;
}
}
收益回报计数;
}
}
}
你能在这篇文章中加入代码而不是链接吗?好吧,我想你不知道你在做什么……你应该把代码读几遍,然后用纸和笔画出算法。下面是你的评论:“仍然超出了时间限制,先生”,我猜这是一个在线编程测试或什么的,他们希望你降低你的渐进复杂性。你有没有描述你正在尝试做什么(你的代码很难理解)?问题是你正在调用badNumbers。Contains(I)
在一个循环中。我很确定.Contains
是O(N),所以你得到了O(N^2)行为。他们(不管他们是谁)希望你减少这个值。你的上限和下限值是多少?这段代码是为什么编写的?OP可以很容易地找到一份混淆师的工作。他试图从“下限”和“上限”绑定的“坏数字”中找出数字之间最长的序列。仍然超过了时间限制,先生。你是在计时发布版本吗?从他的另一个问题来看,错误的数字是{5,4,2,15}
。你错过了一个;
;)(现在更新)@Andrew你说得对,我说得对:D谢谢!谢谢你给OP提供的数字。@John,你好,先生。如果上限值为100000000,有没有办法将运行时间限制在3秒?@LevesqueXylia在更快的机器上运行它。你如何确定需要多长时间?@John,有两个测试用例没有输出beca使用时间限制仅为3秒。谢谢您,先生!!
int counts = 0;
List<int> count = new List<int>();
List<int> goodnumber = new List<int>();
for (int i = lower; i <= upper; i++)
{
if (!badNumbers.Contains(i)) {
goodnumber.Add(i);
} else {
count.Add(goodnumber.Count);
goodnumber.Clear();
}
}
count.Add(goodnumber.Count);
counts = count.Max();
return counts;
HashSet<int> badNumbers = new HashSet<int>() { 5, 4, 2, 15 };
int counts = 0;
int goodNumberCount = 0;
for (int i = lower; i <= upper; i++)
{
if (!badNumbers.Contains(i)) {
++goodNumberCount;
} else {
counts = Math.Max(counts, goodNumberCount);
goodNumberCount = 0;
}
}
counts = Math.Max(counts, goodNumberCount);
return counts;