森林中,每一個兔子都有顏色。其中一些兔子(多是所有)告訴你還有多少其餘的兔子和本身有相同的顏色。咱們將這些回答放在 answers 數組裏。java
返回森林中兔子的最少數量.數組
踩完坑完之後給出題目翻譯:測試
有一堆兔子,隨機點兔子,點中後返回給你與這隻兔子顏色相同的兔子數(不包括這隻兔子自己),不必定會點全部的。根據兔子給的返回結果,得出 最少有多少隻兔子。翻譯
這題描述挺繞的,個人第一反應是使用 bitSet
存兔子同顏色的個數值,有相同的就跳過,沒有相同的就直接向結果加上 同色個數
加上該兔子
獲得 這種顏色的兔子個數
。code
記錄一下這種思路下踩坑的經歷rem
class Solution { public int numRabbits(int[] answers) { int result = 0; if (answers.length == 0) { return result; } BitSet set = new BitSet(); int temp; for (int i = 0 ; i < answers.length ; ++i) { temp = answers[i]; if (!set.get(temp)) { set.set(temp); result += temp + 1; } } return result; } }
自信回車,可是報錯了。文檔
此時測試用例是 [1,0,0,0,1]
很容易找出漏洞,這裏是屬於邏輯錯誤,漏掉了 重複出現的 0
,這裏的邏輯是有問題的。get
簡單修補以後(
line12
以後的for循環加限制條件)源碼
class Solution { public int numRabbits(int[] answers) { int result = 0; if (answers.length == 0) { return result; } BitSet set = new BitSet(); int temp; for (int i = 0 ; i < answers.length ; ++i) { temp = answers[i]; if (temp == 0) { ++result; continue; } if (!set.get(temp)) { set.set(temp); result += temp + 1; } } return result; } }
這裏也是錯,最後一個測試例是 [0,0,1,1,1]
,一下愣住了,這兒有點考對題目的理解,測試 [2,2,0,0,2]
能夠經過,才發現這道題目是不能用 bitSet
的。博客
bitSet
在時間、空間上都有優點,在這種須要記錄(額外信息)重複出現次數的題目中是不能適用的。
由於基礎差,這裏現學一下 Map
的 API
一、HashMap
的底層也是兩個hashSet
經過 hash映射存儲
二、簡單使用
添加 | 解釋 |
---|---|
put(K key, V value) | 添加單個鍵值對 |
putAll(Map<? extends K,? extends V> m) | 添加一整張 Map 進來,至關於遍歷並 put |
刪除 | |
remove(Object key) | 根據 key 清除映射 會返回 value 不存在則返回 null |
clear() | |
獲取 | |
get(Object key) | 返回<V> |
判斷 | 都返回 boolean |
containsKey(Object key) | |
containsValue(Object value) | |
isEmpty() |
上表使用 utool - Java8中文文檔 + IDEA 源碼閱讀 製成
只爲解題 淺嘗輒止
修改 輔助結構爲 hashMap ,改正對應的邏輯關係
特此說明:寫重複代碼並不是本意
爲了便於觀看 留下完整的
if-else
選擇分支供參考
1、
class Solution { public int numRabbits(int[] answers) { int result = 0; if (answers.length == 0) { return result; } Map<Integer, Integer> map = new HashMap<>(); int temp, times; for (int i = 0 ; i < answers.length ; ++i) { temp = answers[i]; // 節約查詢次數 if (temp == 0) { ++result; continue; } if (map.containsKey(temp)) { times = map.get(temp); // 0 1 2 2 if (times < temp) { map.put(temp, ++times); } else { map.put(temp, 0); result += ++temp; } } else { map.put(temp, 0); result += ++temp; } } return result; } }
2、提交版本
class Solution { public int numRabbits(int[] answers) { int result = 0; if (answers.length == 0) { return result; } Map<Integer, Integer> map = new HashMap<>(); int temp, times; for (int i = 0 ; i < answers.length ; ++i) { temp = answers[i]; // 節約查詢次數 if (temp == 0) { ++result; continue; } if (map.containsKey(temp)) { times = map.get(temp); // 0 1 2 2 if (times < temp) { map.put(temp, ++times); continue; } } map.put(temp, 0); result += ++temp; } return result; } }
戰報
本博客爲筆者原創,請不要隨意轉載