2016-09-15 102 views
1

我正在写一个函数,它必须在数字范围内找到给定数字的位置,范围是代码内的一个变量,现在可以说范围是4,因此范围看起来像以下内容: [ 0-3 ] [ 4-7 ] [ 8-11 ] [ 12-15 ] [ 16-19 ] [ 20-23 ] [ 24-27 ]
我想实现的是以最快的方式找到给定数字所属的范围,因为此操作的执行超过了百万个事件。 所以我至今写,并能正常工作,如下:
public String findRange(int range,int number2bFound) { int base = 0; if (number2bFound == 0) number2bFound = 1.0; int higher = 0; while (base <= number2bFound) { higher = base + (range - 1); if ((base <= number2bFound) && (higher >= number2bFound)) return base + "-" + higher; base += range; } return null; }
所以,正如我所说的这个工程,但我相信这是可以做到更有效地实现,仅使用number2bFonud值和range,并排除非常昂贵的循环。查找范围内的数字位置

回答

1

如果所有的范围具有相同的大小并且从0开始,则可以进行简单的划分,此外,您还可以通过模运算找到子范围中的位置。

该过程很简单,找到您的号码n的整数除以你的范围大小,并会给你在哪个子范围它属于,找到子范围内的位置再次找到你的号码的模数针对范围大小

这里是一个例子蟒

def find_position(n,size): 
    return (n//size, n%size) 

与范围大小4

>>> test=[ [0,1,2,3], [4,5,6,7], [8,9,10,11], [12,13,14,15], [16,17,18,19], [20,21,22,23] ] 
>>> find_position(6,4) 
(1, 2) 
>>> test[1][2] 
6 
>>> find_position(11,4) 
(2, 3) 
>>> test[2][3] 
11 
>>> 

的范围5

>>> test=[ [0,1,2,3,4], [5,6,7,8,9] ,[10,11,12,13,14],[15,16,17,18,19], [20,21,22,23,24] ] 
>>> find_position(11,5) 
(2, 1) 
>>> test[2][1] 
11 
>>> 

的过程是一个后续,让​​Size是每个子范围和n你婉找到数的大小,那么你只需要在是把数n你想找到。

那意思就是Java的应该很简单,如果借口是我有点生疏,但这样的事情,我认为

public String findRange(int range,int number2bFound){ 
    int sub_ran_pos, pos; 
    sub_ran_pos = (int) number2bFound/range; //or however the integer division is in java 
    pos = number2bFound % range;    //or however the modulo operation it is in java 
    return sub_ran_pos + "-" + pos;    //or the appropriate return type, for this 
} 

(我不记得了,但如果Java 1指数,那么你需要在每个数字中加1来得到正确的结果)