Java集合与数据结构

187 阅读5分钟

一、map & set 基础练习 1.有十万个数据,找到第一个重复的数据 2. 有十万个数据,去除掉所有重复的数据 3.有十万个数据,统计每个数据出现了多少次 二、 刷题练习

  1. 只出现一次的数字
  2. 复制随机指针 3.宝石与石头 (1)暴力破解法 (2) Hash集合法
  3. 坏键盘打字 5.前 k 个高频单词 6.下厨房 7.斐波那契数列 一、map & set 基础练习

1.有十万个数据,找到第一个重复的数据

就是说我们 在这个题上用了 set 的有关性质 , 我们有十万个数据,要查找到第一个重复的数据,我们可以这样: 我们将 list 中的数据一个一个放入 set中,如果 set没有这个数据,那么就 放入set中,如果 set中包含了这个数据,那么打印这个数据,同时 break;

  1. 有十万个数据,去除掉所有重复的数据

直接遍历这个数组,将数组所有数据全部放进 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. 只出现一次的数字

题解代码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(不要那么严谨,只是了解逻辑即可,不需要联系业务逻辑.)

  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)

题解代码:

  1. 坏键盘打字

题解代码:

题解思路:

这个题非常注意 输出的格式. 输出的时候找出的键盘全都是 大写的字母数字

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…