寻找数字

时间:2015-09-14 14:35:24

标签: c#

嘿,我想更快地查看数字,让我解释一下:

int[] num = { 55, 155};

if (funcNum == num[0],funcNum == num[0]+1,funcNum == num[0]+2,funcNum == num[0]+3,funcNum == num[1]-1,funcNum == num[1]-2,funcNum == num[1]-3)

// dostuff

所以基本上我想快速的方法来知道someNumber是否等于num(+ x到-x),就像num是55而且我想知道它是否等于从40到70的数字也算55呢

谢谢!

4 个答案:

答案 0 :(得分:5)

您可以使用以下内容:

int range = 5; // your range here
if ((funcNum <= num[0] + range) && (funcNum >= num[0] - range)) {
    // do something
}

如果你想测试数组中的所有数字,你可以这样做:

int range = 5; // your range here
bool inRange = true;
if (!num.Any(i => funcNum <= i + range && funcNum >= i - range))
{
    inRange = false;
}    

if (inRange)
{
    // do something
}

(这里希望我能正确理解你的问题)

编辑:已修改,以便inRangetrue处于任何范围内时为funcNum,而非所有范围。

答案 1 :(得分:1)

我相信这就是你要问的问题?:

if (( someNumber <= num[0] + x ) && ( someNumber >= num[0] - x)){
    //someNumber is within range
}
else{
    //someNumber is not within range
}

查看&gt;,&lt;,&gt; =和&lt; =等相同标志,它将帮助您更快地执行检查。

如果你的num [0]是55,你的x是15,这意味着num [0] + x是70,而num [0] -x是40,如果someNumber小于或等于70, (&amp;&amp;)someNumber大于或等于40,然后检查返回true。

答案 2 :(得分:1)

假设范围不重叠(以下某些方法可以容忍多个范围,例如字典方法可以包含每个数字的范围列表)

  • 如果您的可能数字范围很小,您只需将内存换成速度并将所有数字的地图映射到特定范围 - O(1):

    {3,9},公差为1(所以期望2,3,4映射到3,而8,9,10到9)

     var map = new Dictionary<int,int> ({2,3}, {3,3},{4,3}, {8,9}, {9,9, 10,9}};
     if (map.ContainsKey(funcNum)) ....
    

请注意,如果您不需要知道确切的范围,可以使用某种位图/ HasSet来降低内存要求。

  • 如果有很多数字 - 对列表进行排序并找到二分搜索的可能范围(O(log number_of_ranges))。

  • 如果范围的数量很小(测量,但我认为3-5将是目标)而不是常规循环并检查数字是否在当前旁边(如other answer所示)应该可以正常工作(O(number_of_ranges))。

答案 3 :(得分:0)

根据我上面的评论:if (a>40 && a<70)是最快的(从代码的角度来看最干净)。

这是一个简单的操作,不需要调用另一个函数(即你不会使用更多的CPU周期)。