森林中,每一个兔子都有颜色。其中一些兔子(多是所有)告诉你还有多少其余的兔子和本身有相同的颜色。咱们将这些回答放在 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; } }
战报
本博客为笔者原创,请不要随意转载