LeetCode刷题 --- 哈希表

news2024/11/26 10:18:38

1. 两数之和

解题思路:

  1. 利用哈希表,key存数组当前值,value存数组下标
  2. 两数之和等于target,可以看做是两个数是配对
  3. 遍历数组,看哈希表中有没有值和这个当前值配对,如果没有,就存入哈希表
  4. 如果有,当前数,和配对的数,就是所求值。
    public int[] twoSum(int[] nums, int target) {
        int[] res = {-1, -1};
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (!map.containsKey(target - nums[i])) {
                map.put(nums[i], i);
                continue;
            }
            res[0] = map.get(target - nums[i]);
            res[1] = i;
            return res;
        }
        return res;
    }

3. 无重复字符的最长子串

解题思路 -- 哈希表

  1. 定义两个指针,分别是左指针和右指针,for循环遍历字符串
  2. 定义一个hashMap存放数据(用于判断重复)
  3. 右指针不断往后遍历
    1. 如果当前元素不存在,就添加到哈希表中,然后继续遍历
    2. 如果当前元素存在,就把左指针更新成哈希表中value的值+1
      1. ----注意这个位置,如果value的值+1 小于当前left,则不需要更新
  4. 每次循环的时候,计算左右指针之差,获取较大的值
    public static int lengthOfLongestSubstring1(String s) {
        byte[] bytes = s.getBytes();
        int res = 0;

        Map<Byte, Integer> map = new HashMap<>();
        int left = 0;
        int right = 0;
        for (; right < bytes.length; right++) {
            if (map.containsKey(bytes[right])) {
                left = Math.max(left, map.get(bytes[right]) + 1);
                map.put(bytes[right], right);
            } else {
                map.put(bytes[right], right);
            }
            res = Math.max(res, right - left + 1);
        }
        return res;
    }

解题思路 --- 滑动窗口

上面是用双指针解题,其实双指针的题目很容易用滑动窗口的模板来套用解题

  1. 外层右指针向右滑动
  2. 内层左指针向右滑动
    public static int lengthOfLongestSubstring(String s) {
        byte[] bytes = s.getBytes();
        int res = 0;

        Set<Byte> set = new HashSet<>();
        int right = 0;
        int left = 0;
        while (right < bytes.length) {
            while (set.contains(bytes[right])) {
                set.remove(bytes[left]);
                left++;
            }
            res = Math.max(right - left, res);
            set.add(bytes[right]);
            right++;
        }
        return res;
    }

49. 字母异位词分组

解题思路:

看题意,其实就是要把字母相同顺序不同的字符串进行分组。

  1. 先对每个字符串中的字母按照顺序进行排列,得到一个key,这个字符串就作为value中的一个数据
  2. 遍历数组,把所有的字符串都存入到value中
  3. 最后返回map.values()集合即可。
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();

        for (String str : strs) {
            String sort = sort(str);
            if (map.containsKey(sort)) {
                List<String> strings = map.get(sort);
                strings.add(str);
                map.put(sort, strings);
            } else {
                ArrayList<String> strings = new ArrayList<>();
                strings.add(str);
                map.put(sort, strings);
            }
        }

        return new ArrayList<>(map.values());
    }

    private static String sort(String str) {
        char[] chars = str.toCharArray();
        Arrays.sort(chars);
        return Arrays.toString(chars);
    }

136. 只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

解题1

  1. 数组排序,当前值和后面一个值进行比较,相同则说明有重复的,不同则说明没有重复
  2. 循环遍历,每次i+2;
    public static int singleNumber(int[] nums) {
        Arrays.sort(nums);
        int i = 0;
        while (i < nums.length - 1) {
            if (nums[i] == nums[i + 1]) {
                i = i + 2;
            } else {
                return nums[i];
            }
        }
        // 解决长度仅为1的场景
        return nums[nums.length - 1];
    }

解题2

  1. 做一个set,遍历数组,如果set不存在元素,就存入
  2. 如果存在,就删除元素
  3. 最后剩下的一个,就是只出现一次的数字
    public static int singleNumber3(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            if (set.contains(num)) {
                set.remove(num);
            } else {
                set.add(num);
            }
        }

        return  (Integer) set.toArray()[0];
    }

解题3 --- 位运算

 

    public static int singleNumber4(int[] nums) {
        int single = 0;
        for (int num : nums) {
            single = single ^ num;
        }
        return  single;
    }

387. 字符串中的第一个唯一字符

解题思路:

  1. 定义一个map,key存放字符,value存放下标
  2. 遍历字符串,如果map不存在,就存入
  3. 如果map存在,就把value值改为字符串长度
  4. 遍历map的value,每次取value较小的一个值
  5. 如果value等于字符串长度,说明不存在单个字符,返回-1,否则value值就是第一次出现的单个字符。
    public static int firstUniqChar(String s) {
        char[] chars = s.toCharArray();
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < chars.length; i++) {
            if (map.containsKey(chars[i])) {
                map.put(chars[i], chars.length);
            } else {
                map.put(chars[i], i);
            }
        }

        int res = s.length();
        for (Integer value : map.values()) {
            res = Math.min(res, value);
        }
        return res == s.length() ? -1 : res;
    }

819. 最常见的单词

对字符串做一个分割,然后遍历,把单词存入到map中,最后取出符合要求的单词即可。

易错点:单词的分割

class Solution {
    public String mostCommonWord(String paragraph, String[] banned) {
        String[] pars = paragraph.split(" |\\!|\\?|\\;|,|\\.|\\'");
        Map<String, Integer> map = new HashMap<>();

        for (String par : pars) {
            if (par.equals("")) {
                continue;
            }
            par = par.toLowerCase();
            if (map.containsKey(par)) {
                map.put(par, map.get(par) + 1);
            } else {
                map.put(par, 1);
            }
        }

        Set<String> set = new HashSet<>(Arrays.asList(banned));

        String res = null;
        int value = 0;
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if (set.contains(entry.getKey())) {
                continue;
            } else {
                if (entry.getValue() > value) {
                    value = entry.getValue();
                    res = entry.getKey();
                }
            }
        }
        return res;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/598650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fiddler抓包工具之fiddler设置过滤

fiddler设置过滤 基本的过滤操作流程以百度为例 步骤&#xff1a; 1、右侧高级工具栏点击Filters》勾选Use Filters》选择Show only Internet Hosts和Show only the following Hosts》在文本框中输入host地址 2、点击Changes not yet saved》再点击Actions》Run Filterset …

【医学图像】图像分割系列.4

介绍几篇使用Transformer结构做医学图像分割的论文&#xff1a;CASTformer&#xff08;NeuralPS2022&#xff09;&#xff0c;PHNet&#xff08;arXiv2023&#xff09;。 Class-Aware Adversarial Transformers for Medical Image Segmentation, NeuralPS2022 解读&#xff1a…

37. C++ 基于范围的for循环、指针空值——nullptr(c++11新特性)

目录 1.基于范围的for循环语法如下&#xff1a; 2.一些编程中的实例 3.指针空值——nullptr c11标准下的NULL和nullptr 今天进行了新的学习&#xff0c;基于范围的for循环。基于范围的 for 循环&#xff08;Range-based for loop&#xff09;是 C11 引入的一种循环结构…

机器学习 监督学习 Week3

Logistic Regression 一个用于分类的算法&#xff0c;模型拟合后&#xff0c;以某些值作为阈值&#xff0c;将数据区分为不同的类别。过去的回归算法中&#xff0c;y的值可以范围很广&#xff0c;而在分类算法中y代表类别&#xff0c;往往只有几个&#xff0c;甚至只有两个(tru…

物联网HMI的关键驱动力—SCADA级功能库和控件库

一、前言 在这个数字化时代&#xff0c;物联网HMI已成为连接人与设备之间的关键纽带&#xff0c;为用户提供直观、智能的交互体验&#xff0c;背后强大的关键驱动力扮演着至关重要的角色&#xff0c;其中SCADA级功能库和控件库的引入成为了物联网HMI设计和开发的核心要素。 S…

论文参考文献怎么引用|Word引用多篇参考文献|word参考文献连续引用|参考文献连续编号|交叉引用

一、参考文献准备 首先将参考文献在段落设置模型中进行编号&#xff0c;通过“交叉引用”对“参考文献”编号引用&#xff0c;以“[x-y]”引用格式实现连续多个文献引用。以实现以[1-3]交叉引用格式来引用[1][2][3] 三个连续参考文献为例说明本方法。 二、参考文献连续编号[…

Redis数据类型之列表List

Redis数据类型之列表List list中的命令如下&#xff1a; lpush&#xff1a;从左边插入&#xff0c;插入的数据是倒叙 LPUSH key value1 [value2] 将一个或多个值插入到列表头部 lpush k1 a b c d e f ; 输出结果 f e d c b a lpop k1; 输出 f 从左边pop弹出时先弹出的是f&…

ESD监控系统、防静电闸机的应用案例

ESD监控系统和防静电闸机是在电子厂、医药厂、半导体厂、航空航天等领域广泛应用的静电措施&#xff0c;可以有效地保护生产线上的产品安全&#xff0c;提高产品质量和可靠性。 近日一家电子元器件公司在其生产线上安装了防静电监控系统、ESD防静电闸机&#xff0c;用于控制人员…

Vue之基本使用

一、前端的发展史 1.HTML(5)、CSS(3)、JavaScript(ES5、ES6)&#xff1a;编写一个个的页面 -> 给后端(PHP、Python、Go、Java) -> 后端嵌入模板语法 -> 后端渲染完数据 -> 返回数据给前端 -> 在浏览器中查看 2.Ajax的出现 -> 后台发送异步请求&#xff0c;…

今天是六一儿童节~身为我们班的信息担当的我为我们班同学准备了一个小惊喜,你确定不来看看吗(turtle库实现:送给同学们一朵小红花)

目录 一.实现思路 二.花朵的实现方法 三.花朵的茎实现方法 四.画出第一片叶子的方法 五.画出第二片叶子的方法 六.如何设置页面主体 结尾 今天呢&#xff0c;也是一年一度的六一儿童节&#xff08;虽然各位大佬可能不过&#xff0c;但是我还是要过的&#xff09;&#xf…

JMeter性能测试零基础完整入门版,视频教程加源码免费看

目录 1. Jmeter简介 2. Jmeter安装 2.1 JDK安装 2.2 JMeter安装 3. 测试实例 3.2 请求参数 3.3 返回结果 4. JMeter脚本编写 4.1 添加线程组 4.2 添加HTTP请求 4.3 添加察看结果树 4.4 添加用户自定义变量 4.5 添加断言 4.6 添加断言结果 4.7 添加聚合报告 5. 执…

Spring Boot如何实现微服务架构中的API网关?

Spring Boot如何实现微服务架构中的API网关&#xff1f; 随着微服务架构的流行&#xff0c;越来越多的企业开始构建自己的微服务系统。在这种情况下&#xff0c;API网关变得尤为重要。API网关是微服务架构中的一个组件&#xff0c;它可以帮助我们管理和路由所有的API请求。Spr…

【LeetCode热题100】打卡第10天:删除链表倒数第N个节点

文章目录 删除链表倒数第N个节点⛅前言&#x1f512;题目&#x1f511;题解 删除链表倒数第N个节点 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&a…

8. 何为ECC

非对称加密 在我们认知里面&#xff0c;通常说到非对称加密&#xff0c;就会弹出2个词&#xff0c;RSA和ECC&#xff0c;做过对称加密的都非常清楚&#xff0c;RSA其实就是模指运算。用公钥来加密&#xff0c;私钥来解密&#xff1b;私钥签名&#xff0c;公钥验签。但是提到EC…

【数据结构】链表 linked list

一、什么是链表 零散的内存空间存储&#xff0c;由元素和指针组成 二、常用操作 1.原理 access&#xff1a;通过next指针遍历 时间复杂度&#xff1a;O(N) search&#xff1a;通过next指针遍历 时间复杂度&#xff1a;O(N) insert&#xff1a;找个新的内存空间存储新元素…

学习HCIP的day.10

十、对BGP一些情况的总结&#xff1a; 1、路由条目不优特殊情况&#xff1a; 在BGP协议中&#xff0c;存在一种无法优秀的路由条目&#xff1b;假设R4路由表中存在一条非BGP产生的到达5.5.5.5的路由条目&#xff0c;且该条目用于R4与R5建立BGP邻居关系&#xff1b;那么之后R5…

【Linux网络】搭建LNMP架构

搭建LNMP架构 一、编译安装MySQL服务二、安装Nginx服务三、安装配置PHP解析环境四、部署Discuz社区论坛Web应用五、部署博客论坛应用六fpm进程优化 一、编译安装MySQL服务 1.安装MySQL环境依赖包 yum -y install gcc gcc-c ncurses ncurses-devel bison cmake2、创建运行用户 u…

地震勘探基础(三)之地震波的时距曲线

时距曲线 在反射波地震勘探中&#xff0c;一般是在地面激发地面接收&#xff0c;激发点到接受点的距离称为炮间距&#xff08;offset&#xff09;&#xff0c;用 x x x表示。如果炮间距为0&#xff0c;称为自激自收。 单道接收&#xff1a;激发一次只在一个位置上接收地震波。…

在线ps网页版推荐,让你摆脱安装包的烦恼

在设计领域&#xff0c;Photoshop的地位多年来一直是不可动摇的&#xff0c;其强大的功能可以毫不夸张地说&#xff1a;只有你想不到的&#xff0c;没有PS做不到的。但强大如PS&#xff0c;也有自己的小局限性&#xff1a;处理矢量图相对较弱&#xff0c;更难掌握。今天&#x…

微信小程序——监听页面滑动(一)onPageScroll

微信小程序——手把手教你学会监听页面滑动 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现核心干货如何进行页面监听了解onPageScroll实际使用onPageScroll 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09; 知识专栏专栏链接微信小程序专栏ht…