好吧,所以我正在研究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的新手。提前感谢任何答案。
解决了,谢谢所有精彩的答案。
答案 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)