亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從包含鍵的地圖中獲取最近鍵的最快方法:5、10、15、20、25 等到 200

從包含鍵的地圖中獲取最近鍵的最快方法:5、10、15、20、25 等到 200

楊魅力 2023-12-13 16:46:45
我有幾個鍵,分別為 5、10、15 等,最多 200 個,其中僅包含 5 的倍數。每個鍵都有一個連接的字符串,如下例所示:5 = test510 = test1015 = test15我有一個隨機變量,它會變化,可能在 0 - 500 之間。我想獲取最接近的密鑰及其字符串,我已經找到了一個解決方案,但我想知道是否有更好的解決方案,因為這種情況僅使用倍數共 5 個。TreeMap<Long,String> map = new TreeMap<>();map.put(5L,"a");map.put(10L,"b");map.put(25L,"e");map.put(20L,"d");map.put(15L,"c");Long key = 42L;Map.Entry<Long,String> low = map.floorEntry(key);Map.Entry<Long,String> high = map.ceilingEntry(key);Object res = null;if (low != null && high != null) {    res = Math.abs(key-low.getKey()) < Math.abs(key-high.getKey())            ?   low.getValue()            :   high.getValue();} else if (low != null || high != null) {    res = low != null ? low.getValue() : high.getValue();}System.out.println(res);
查看完整描述

3 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

您不需要排序的地圖。只要用一些數學來做就可以了。

      long key = ((key + 2) / 5) * 5

它的工作方式是這樣的。

  1. 如果除以 5 的余數key為 0、1 或 2,則加 2 不會影響除以 5。余數將被舍去,乘以 5 將得到最接近的較小倍數。

  2. 如果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));

      }


查看完整回答
反對 回復 2023-12-13
?
LEATH

TA貢獻1936條經驗 獲得超7個贊

您可以使用模運算符來獲取您要查找的密鑰


您可以使用類似的方法來計算最近的 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


查看完整回答
反對 回復 2023-12-13
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

一種簡單的方法是找到最接近給定隨機數的 5 倍數,并檢查該數字是否存在于地圖中 ( O(1))。如果存在,則為答案,如果不存在,則答案為最大值 (200) 或最小值 (5)。

最大 200 -> 對于大于200 的數字
最小 5 -> 對于小于5的數字

對于介于兩者之間的數字 -
以 143 為例,因此最接近的 5 的倍數將是 145。這很容易找到。


查看完整回答
反對 回復 2023-12-13
  • 3 回答
  • 0 關注
  • 210 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號