我在进行一项在线测试,需要实现一段代码来检查某个值是否在数组中。我编写了以下代码:
using System;
using System.IO;
using System.Linq;
public class Check
{
public static bool ExistsInArray(int[] ints, int val)
{
if (ints.Contains(val)) return true;
else return false;
}
}
现在我认为这段代码没有问题,因为它可以正常运行,但是某种程度上我仍然未能通过测试,因为当数组包含一百万个值时,“速度不够快”。
我自己编写的唯一代码是:
if (ints.Contains(val)) return true;
else return false;
我需要处理的其它代码。
有没有办法加快这个过程的速度?
提前致谢。
编辑: 我发现有人似乎参加了与我相同的测试,而且似乎可以节省CPU周期。
现在他方法内的解决方案是:
var lower = 0;
var upper = ints.Length - 1;
if ( k < ints[lower] || k > ints[upper] ) return false;
if ( k == ints[lower] ) return true;
if ( k == ints[upper] ) return true;
do
{
var middle = lower + ( upper - lower ) / 2;
if ( ints[middle] == k ) return true;
if ( lower == upper ) return false;
if ( k < ints[middle] )
upper = Math.Max( lower, middle - 1 );
else
lower = Math.Min( upper, middle + 1 );
} while ( true );
现在我明白了这段代码的作用,但我不清楚它为什么应该更快。如果有人能详细解释一下就好了。
HashSet<int>
代替int[]
。此外,建议将该方法本身进行清理,因为可以编写return ints.Contains.val);
,如果您这样做了,为什么不直接在调用代码中编写它呢? - Igor