IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 剑指offer-之-哈希表 -> 正文阅读

[数据结构与算法]剑指offer-之-哈希表

35.复杂链表的复制 难度:中等

本题核心:哈希表,用哈希表来存原链表的每个节点和新链表的每个节点,两者是一一对应的关系。我们先存储只带有val的每一个新节点,那么哈希表中存储的每一个旧节点和每一个新节点都是key-value的关系,接下来就是通过这种关系让新节点的next和random指向正确的节点,最后返回新节点的头结点即可。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteNode(ListNode head, int val) {
        if(head == null)    return null;
        ListNode newHead = new ListNode(-1);
        newHead.next = head;
        ListNode cur = head;
        ListNode pre = newHead;
        while(cur != null){
            if(cur.val == val){
                pre.next = cur.next;
            }
            pre = cur;
            cur = cur.next;
        }
        return newHead.next;
    }
}

50.第一个只出现一次字符 难度:简单

本题用哈希表可以很简便地解决,关键点在于key-value键值对类型是Character-Boolean。Character:对应每一个字符,Boolean:对应该字符是否只出现一次,若只出现一次为true,否则为flase。将每个字符存储到哈希表中后,再从原先字符串的顺序遍历,判断每个字符对应的value值,得到第一个只出现一次的字符。

class Solution {
    public char firstUniqChar(String s) {
        Map<Character,Boolean> map = new HashMap<>();
        char[] ch = s.toCharArray();
        for(char c : ch){
            map.put(c,!map.containsKey(c));
        }
        for(char c : ch){
            if(map.get(c))  return c;
        }
        return ' ';
    }
}

48. 最长不含重复字符的子字符串 难度:中等

本题的主要思想是动态规划,但是需要用到哈希表来存储数据。tmp是以当前字符为尾字符的最长不含重复字符字符串的最大长度,res为当前遍历到的最长不包含重复字符的字符串的最大长度。

哈希表中存储的key:字符串中的字符,value:该字符在字符串中的下标。

因为字符有可能是重复的,所以当遍历到重复字符时,会刷新哈希表中该字符的value值,而 i 为字符在这次刷新前该字符的下标,那么当前的i和j对应的就是该字符串中相同的两个字符下标,j - i就是 以 j 对应的字符为尾字符的字符串长度。

但是j-i这个字符串里面可能有其他重复字符,所以我们将tmp与j-i来比较,刷新tmp的值,让tmp存储的是不含重复字符的子字符串长度

如果tmp >= j - i,说明j-i对应字符串在tmp对应字符串中,那么将tmp刷新为j-i。

如果tmp < j - i,说明 j - i 对应的字符串中包含tmp对应的字符串,那么j-i中必然有重复字符,所以将不能将tmp刷新为j-i,只需要将tmp+1即可。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Map<Character,Integer> map = new HashMap<>();
        int tmp = 0;
        int res = 0;
        for(int j = 0; j < s.length(); ++j){
            int i = map.getOrDefault(s.charAt(j),-1);
            map.put(s.charAt(j),j);
            tmp = (tmp < j-i) ? tmp+1 : j-i;
            res = Math.max(res,tmp);
        }
        return res;
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-09 19:49:07  更:2021-11-09 19:50:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:47:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码