检查int是否在数组中的两个项之间

时间:2014-02-26 22:39:52

标签: java arrays

好吧,所以我正在研究java中的调平系统。我从上一个问题中得到了这个用于定义级别“exp”要求的内容:

    int[] levels = new int[100];
    for (int i = 1; i < 100; i++) {
        levels[i] = (int) (levels[i-1] * 1.1);
    }

现在,我的问题是如何确定exp级别是否在数组中的两个不同整数之间,然后返回两者中的较低者?我找到了一些 close ,但不是我正在寻找的here,它说二进制搜索。一旦我找到exp之间的值,我将能够确定用户的级别。或者,如果其他人有更好的想法,请不要犹豫,提及它。请原谅我可能出现的错误,我是Java的新手。提前感谢任何答案。

解决了,谢谢所有精彩的答案。

4 个答案:

答案 0 :(得分:1)

您可以使用built-in binary search method

int exp = . . .
int pos = Arrays.binarySearch(levels, exp);
if (pos < 0) {
    // no exact match -- change pos to the insertion index
    pos = -pos - 1;
    // Now exp is between levels[pos] and levels[pos - 1]
    // (or less than levels[0] if pos is now 0)
} else {
    // exp is exactly equal to levels[pos]
}

答案 1 :(得分:1)

使用一般排序的数字数组,二进制搜索是可行的方法,即O(log n)。但是因为数字之间存在数学关系(每个数字是前一个数字的1.1倍),所以利用这一事实。您正在寻找最大指数level,以便

levels[0] * Math.pow(1.1, level) <= exp

解决等级,

level = log{base 1.1}(exp / levels[0])

利用log a (b)= ln(b)/ ln(a)...

的事实
int level = (int) Math.log(exp/levels[0]) / Math.log(1.1);

由于数学关系,你只需要这个计算,而不是搜索,所以它是O(1)。

double base = 1;
double factor = 1.1;

for (double score : Arrays.asList(1.0, 1.1, 1.3, 8.6, 9.46))
{
   int level = (int) (Math.log(score / base) / Math.log(factor));
   System.out.println(level);
}

打印

0
1
2
22
23

答案 2 :(得分:0)

是的,你应该在这里进行二元搜索,因为你的数组元素似乎已经排序了 这是从你初始化它们的方式得出的 你当然也可以进行线性搜索,但前者更好。

答案 3 :(得分:0)

为什么不使用Arrays Class

int valueToFind = 100;
int index = Arrays.binarySearch(levels, valueToFind)