因此,我进行了在线测试,其中我必须实现一段代码以简单地检查该值是否在数组中。我写了以下代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我在这里没有看到任何问题,因为代码可以正常工作,但是由于数组包含一百万个值,这样做“不够快”,因此我仍然无法通过测试。
我自己编写的唯一代码是:
if (ints.Contains(val)) return true;
else return false;
Run Code Online (Sandbox Code Playgroud)
我得到的另一个代码可以使用。
有没有办法加快这个过程?
提前致谢。
编辑:我碰到了一个页面,其中有人显然接受了与我相同的测试,这似乎可以节省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 );
Run Code Online (Sandbox Code Playgroud)
现在,我看到了这段代码是如何工作的,但是我不清楚为什么这应该更快。如果有人可以详细说明会很好。
如果是排序数组,则可以使用BinarySearch来加快过程
public static bool ExistsInArray(int[] ints, int val)
{
return Array.BinarySearch(ints, val) >= 0;
}
Run Code Online (Sandbox Code Playgroud)