3 回答
TA贡献1963条经验 获得超6个赞
您不需要排序的地图。只要用一些数学来做就可以了。
long key = ((key + 2) / 5) * 5
它的工作方式是这样的。
如果除以 5 的余数
key
为 0、1 或 2,则加 2 不会影响除以 5。余数将被舍去,乘以 5 将得到最接近的较小倍数。如果
key
除以 5 的余数为 3 或 4,则在进行相同的除法和乘法后,加上 2 会将其推至下一个更高的倍数。
Map<Long, String> map = new HashMap<>();
map.put(5L, "a");
map.put(10L, "b");
map.put(25L, "e");
map.put(20L, "d");
map.put(15L, "c");
map.put(30L, "f");
map.put(0L, "g");
Random r = new Random();
for (int i = 0; i < 20; i++) {
long key = r.nextInt(31);
long save = key;
// simple calculation that guarantees nearest multiple of 5.
key = ((key + 2) / 5) * 5;
System.out.printf("Random = %3d, key = %3d, value = %s%n", save,
key, map.get(key));
}
TA贡献1936条经验 获得超6个赞
您可以使用模运算符来获取您要查找的密钥
您可以使用类似的方法来计算最近的 5 倍数键。
public Long getNearestKey(Long random) {
Long modulus = random % 5;
Long key = modulus < 3 ? random - modulus : random + (5 - modulus);
return key;
}
然后在您调用的方法中getNearestKey(42L),它将返回最接近的值。
一个简单的测试:
public static void main(String[] args) {
for(long i = 400; i <= 405; i++)
System.out.println(getNearestKey(i));
}
public static Long getNearestKey(Long random) {
Long modulus = random % 5;
Long key = modulus < 3 ? random - modulus : random + (5 - modulus);
return key;
}
输出:
400
400
400
405
405
405
TA贡献1863条经验 获得超2个赞
一种简单的方法是找到最接近给定随机数的 5 倍数,并检查该数字是否存在于地图中 ( O(1))。如果存在,则为答案,如果不存在,则答案为最大值 (200) 或最小值 (5)。
最大 200 -> 对于大于200 的数字
最小 5 -> 对于小于5的数字
对于介于两者之间的数字 -
以 143 为例,因此最接近的 5 的倍数将是 145。这很容易找到。
添加回答
举报