第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

楊魅力 2023-12-13 16:46:45
我有幾個鍵,分別為 5、10、15 等,最多 200 個,其中僅包含 5 的倍數(shù)。每個鍵都有一個連接的字符串,如下例所示:5 = test510 = test1015 = test15我有一個隨機變量,它會變化,可能在 0 - 500 之間。我想獲取最接近的密鑰及其字符串,我已經(jīng)找到了一個解決方案,但我想知道是否有更好的解決方案,因為這種情況僅使用倍數(shù)共 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條經(jīng)驗 獲得超6個贊

您不需要排序的地圖。只要用一些數(shù)學(xué)來做就可以了。

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

它的工作方式是這樣的。

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

  2. 如果key除以 5 的余數(shù)為 3 或 4,則在進行相同的除法和乘法后,加上 2 會將其推至下一個更高的倍數(shù)。

     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));

      }


查看完整回答
反對 回復(fù) 2023-12-13
?
LEATH

TA貢獻1936條經(jīng)驗 獲得超7個贊

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


您可以使用類似的方法來計算最近的 5 倍數(shù)鍵。


public Long getNearestKey(Long random) {

   Long modulus = random % 5;

   Long key = modulus < 3 ? random - modulus : random + (5 - modulus);

   return key;

}

然后在您調(diào)用的方法中g(shù)etNearestKey(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


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

TA貢獻1863條經(jīng)驗 獲得超2個贊

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

最大 200 -> 對于大于200 的數(shù)字
最小 5 -> 對于小于5的數(shù)字

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


查看完整回答
反對 回復(fù) 2023-12-13
  • 3 回答
  • 0 關(guān)注
  • 229 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號