java - 检查 int 是否位于数组中的两个项目之间

标签 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 级别是否介于数组中的两个不同整数之间,然后返回两个整数中的较低者?我发现了一些接近的东西,但不完全是我正在寻找的here它说的是二分搜索。一旦我找到 exp 落在哪个值之间,我就能够确定用户的级别。或者,如果其他人有更好的想法,请随时提出。请原谅我可能犯的菜鸟错误,我是 Java 新手。预先感谢您的任何答复。

已解决,感谢所有精彩答案。

最佳答案

对于一般的有序数字数组,二分查找是可行的方法,其时间复杂度为 O(log n)。但由于数字之间存在数学关系(每个数字是前一个数字的 1.1 倍),因此请利用这一事实。您正在寻找最大指数 level 使得

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

求解水平,

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

利用 loga(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

关于java - 检查 int 是否位于数组中的两个项目之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22055053/

相关文章:

java - Android 应用程序在转而使用 java 创建布局后停止工作

java - 将 Apache Beam 的 PCollection 对象收集到驱动程序内存中

python - 我可以使用列表来寻址 numpy 数组吗?

c++ - 如何返回带大小的 POD 数组引用?

javascript - 给定一个 JSON 对象数组,如何根据嵌套值获取 JSON 对象 X?

java - 从磁盘加载存储的 RSA 公钥/私钥?

java - 不包含4级-Java

java - 替换全部 ("\\<.?>") 与替换全部 ("<.?>")

java - 从字节数组创建对象(使用构造函数)

java - 我需要从 txt 文件上的 1000 个数字的列表创建一个数组列表。 java