一、map & set 基础练习 1.有十万个数据,找到第一个重复的数据 2. 有十万个数据,去除掉所有重复的数据 3.有十万个数据,统计每个数据出现了多少次 二、 刷题练习
- 只出现一次的数字
- 复制随机指针 3.宝石与石头 (1)暴力破解法 (2) Hash集合法
- 坏键盘打字 5.前 k 个高频单词 6.下厨房 7.斐波那契数列 一、map & set 基础练习
1.有十万个数据,找到第一个重复的数据
就是说我们 在这个题上用了 set 的有关性质 , 我们有十万个数据,要查找到第一个重复的数据,我们可以这样: 我们将 list 中的数据一个一个放入 set中,如果 set没有这个数据,那么就 放入set中,如果 set中包含了这个数据,那么打印这个数据,同时 break;
- 有十万个数据,去除掉所有重复的数据
直接遍历这个数组,将数组所有数据全部放进 set中,重复的数据自然会 插入失败,所以最后 set 中的元素全都是 不重复的数据.
3.有十万个数据,统计每个数据出现了多少次 使用map 和 set 来解题
这道题非常经典,所以我们 一定要理解深刻
我们将 数组中的 各个数据,及数据出现的次数 作为一个键值对 放入Map 中
put之前先判断 map 中之前是否有 key ,如果没有的话,map.getKey() == null ,我们就直接 map.put( key,1 ).
如果没有的话,先 int count = map.getKey(), 得到这个key之前出现的次数,然后 map.put(key,count+1)
最后遍历 map,将map的所有键值对 全部打印出来.
二、 刷题练习
- 只出现一次的数字
题解代码1:
写这个代码的思路: 我们有一个 Set 的集合,先遍历数组,如果Set 里不包含 nums[i],那么就把 nums[i] 放入 set 中,但是如果 Set 中包含 nums[i] ,那么就把 set中的 nums[i] 删除.
到最后 set中剩下的就是只出现一次 的数字
题解代码2:
写这个思路的代码: 这个是用Map 记录了nums 数组中每一个数据出现的次数,最后遍历 map.entrySet(),当 entry.getVaue()==1 时,这个数据就出现了一次,返回 entry.getKey().
如果在这组数据中没有单独出现的数字,那么返回-1(不要那么严谨,只是了解逻辑即可,不需要联系业务逻辑.)
- 复制随机指针
比如说我们有这样一个链表,我们要做到的就是 复制这样一组相同结构的 链表
这里有一个注意点,同样也是难点:就是引用的复制
我们在复制节点的时候,不能够全部一块复制,否则就会出现这样的情况
我们发现复制节点的全部信息的话,新节点指向的next 、random 指向的还是原节点的位置
所以 next、random 我们要重新赋值,新节点新链表的结构要像原链表一样…
我们如何解决呢?
我们在 遍历原链表的时候,每走一个节点 cur ,就 new 一个新的节点 node ,原节点和新节点是一一对应的关系,map.put(cur,node ).
我们可以通过这样,来使新的节点组成 原链表的关系
map.get(cur).next = map.get(cur.next) map.get(random).next = map.get(cur.random);
题解代码:
3.宝石与石头
(1)暴力破解法
暴力法的思路很直观,遍历字符串 stones,对于 stones 中的每个字符,遍历一次字符串 jewels,如果其和 jewels 中的某一个字符相同,则是宝石。
(2) Hash集合法
方法一中,对于字符串stones 中的每个字符,都需要遍历一次字符串 jewels,导致时间复杂度较高O(m*n)。如果使用哈希集合存储字符串 jewels 中的宝石,则可以降低判断的时间复杂度。
遍历字符串 jewels,使用哈希集合存储其中的字符,然后遍历字符串 stones,对于其中的每个字符,如果其在哈希集合中,则是宝石。时间复杂度 O(m+n)
题解代码:
- 坏键盘打字
题解代码:
题解思路:
这个题非常注意 输出的格式. 输出的时候找出的键盘全都是 大写的字母数字
str 1 ---- 期望输出的字符串 str 2 — 实际输出的字符串 设置 一个 setAutal 将实际输出的键的大写字符放入到 setAutal 中
先将 str2 的字符转换成为 大写 ,然后 str2 转换成数组 ,foreach 遍历.
将大写的 str2 字符放入到 setAutal 集合中.
设置一个 setBroken 将坏的键 放入到 这个集合中
怎么判断这是一个坏的键呢?
遍历 str1 期望输出的字符串(记得直接大写遍历),如果 setAutal 不包含 str1 中的键,把那个键 存入到 setBroken.
打印的时候 有几点注意: 他打印的规则 ,一定是遍历期望打印的数组,一个一个字符遍历,只要 期望打印的字符 在 setAutal 中没有的话,那么先放进 setBroken ,然后 打印 这个字符 ch,我们为什么要放进 setBroken 呢? 因为打印之前还有一个条件,就是 setBroken 中已经有的就不打印了.否则就会出现 这个坏的键 重复打印.
5.前 k 个高频单词
题目描述:
———————————————— 版权声明:本文为CSDN博主「RAIN 7」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/rain67/arti…