面试经典150题【81-90】

文章目录

  • 面试经典150题【81-90】
    • 530.二叉搜索树的最小绝对差值
    • 230.二叉搜索树中第k小的元素
    • 98.验证二叉搜索树
    • 92.反转链表II
    • 25.K个一组翻转链表
    • 146.LRU缓存
    • 909. 蛇梯棋(未做)
    • 433.最小基因变化
    • 127.单词接龙(未做)
    • 17.电话号码的字母组合

面试经典150题【81-90】

530.二叉搜索树的最小绝对差值

在中序遍历的过程中 cur.val -pre.val 即可。

230.二叉搜索树中第k小的元素

中序遍历,用两个临时变量记录遍历位置和最终答案即可

98.验证二叉搜索树

中序遍历后检查是否有序。

92.反转链表II

在这里插入图片描述
截取出那段要反转的链表,然后用多个节点,遍历即可。

class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next=head;
        ListNode pre =dummyNode;
        // 第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点
        for(int i=0;i<left-1;i++) pre=pre.next;
        // 第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点
        ListNode rightNode = pre;
        for(int i=0;i<right-left+1 ; i++) rightNode=rightNode.next;
        // 第 3 步:切断出一个子链表(截取链表)
        ListNode leftNode=pre.next;
        ListNode curr = rightNode.next;
        // 切断原来的链表的连接
        pre.next = null;
        rightNode.next = null;
        // 用递归反转链表
        reverseLinkedList(leftNode);
        //拼接链表
        pre.next=rightNode;
        leftNode.next=curr;
        return dummyNode.next;
    }

    void reverseLinkedList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode nextNode = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nextNode;
        }
    }
}

25.K个一组翻转链表

在这里插入图片描述
遍历链表,合适的话就切割出来翻转,和上题思路一样。
需要定义多个变量
ListNode pre; //上一段的最后一个
ListNode start; //这一段的开始
ListNode end; //这一段的结束
ListNode nextStart; //下一段的开始
然后将start -> end 送去翻转

146.LRU缓存

请你设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

  • 对于 get 操作,首先判断 key 是否存在:

    如果 key 不存在,则返回 −1;
    如果 key 存在,则 key 对应的节点是最近被使用的节点。通过哈希表定位到该节点在双向链表中的位置,并将其移动到双向链表的头部,最后返回该节点的值。

  • 对于 put 操作,首先判断 key 是否存在:

    如果 key 不存在,使用 key 和 value 创建一个新的节点,在双向链表的头部添加该节点,并将 key 和该节点添加进哈希表中。然后判断双向链表的节点数是否超出容量,如果超出容量,则删除双向链表的尾部节点,并删除哈希表中对应的项;

    如果 key 存在,则与 get 操作类似,先通过哈希表定位,再将对应的节点的值更新为 value,并将该节点移到双向链表的头部。

class LRUCache {
    class DLinkedNode{
        DLinkedNode prev;
        DLinkedNode next;
        int key;
        int value;
        public DLinkedNode(){}
        public DLinkedNode(int key,int val){
            this.key = key;
            value = val;
        }
    }

    private Map<Integer, DLinkedNode> cache = new HashMap<Integer, DLinkedNode>();
    private int size;
    private int capacity;
    private DLinkedNode head, tail;

    public LRUCache(int capacity) {
        this.size = 0;
        this.capacity = capacity;
        // 使用伪头部和伪尾部节点
        head = new DLinkedNode();
        tail = new DLinkedNode();
        head.next = tail;
        tail.prev = head;
    }


    public int get(int key) {
        DLinkedNode node = cache.get(key);
        if(node == null) return -1;
        //如果存在,就要移动到表头
        moveToHead(node);
        return node.value;
    }

    public void put(int key, int value) {
        DLinkedNode node =cache.get(key);
        if(node == null){
            //新增
            DLinkedNode newNode = new DLinkedNode(key,value);
            cache.put(key,newNode);
            addToHead(newNode);
            size++;
            if(size > capacity){
                DLinkedNode dLinkedNode = removeTail();
                //就是因为这里需要用到key才能删除,所以DLinkedNode节点才需要加上Key
                cache.remove(dLinkedNode.key);
                size--;
            }
        }else{
            //修改
            node.value=value;
            moveToHead(node);

        }

    }

    private void addToHead(DLinkedNode node){
        node.next = head.next;
        node.next.prev = node;
        head.next = node;
        node.prev = head;
    }
    private void removeNode(DLinkedNode node){
        node.prev.next = node.next;
        node.next.prev = node.prev;

    }
    private void moveToHead(DLinkedNode node) {
        removeNode(node);
        addToHead(node);
    }
    private DLinkedNode removeTail(){
        DLinkedNode res=tail.prev;
        removeNode(res);
        return res;
    }


}

909. 蛇梯棋(未做)

额这题意还是算了。反正解法和下一个题差不多。BFS

433.最小基因变化

在这里插入图片描述
从start变为end, 每一步只能变换一个字母,且变换的必须在bank里。
使用BFS记录路径,且不要重复。最短路径长度。

127.单词接龙(未做)

这个题和上一个题一样的逻辑,只不过数据量很大,可能要用双向的搜索。
从start往中间搜,从end往中间搜。直到重合。

17.电话号码的字母组合

在这里插入图片描述

经典回溯

class Solution {
    public List<String> letterCombinations(String digits) {
                List<String> combinations = new ArrayList<String>();
        if (digits.length() == 0) {
            return combinations;
        }
        Map<Character, String> phoneMap = new HashMap<Character, String>() {{
            put('2', "abc");
            put('3', "def");
            put('4', "ghi");
            put('5', "jkl");
            put('6', "mno");
            put('7', "pqrs");
            put('8', "tuv");
            put('9', "wxyz");
        }};
        backtrack(combinations, phoneMap, digits, 0, new StringBuffer());
        return combinations;

    }
    public void backtrack(List<String> combinations, Map<Character, String> phoneMap, String digits, int index, StringBuffer combination) {
        if (index == digits.length()) {
            combinations.add(combination.toString());
        } else {
            char digit = digits.charAt(index);
            String letters = phoneMap.get(digit);
            int lettersCount = letters.length();
            for (int i = 0; i < lettersCount; i++) {
                combination.append(letters.charAt(i));
                backtrack(combinations, phoneMap, digits, index + 1, combination);
                combination.deleteCharAt(index);
            }
        }
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++Qt学习——QFile、QPainter、QChart

目录 1、QFile&#xff08;文本读写&#xff09;——概念 1.1、拖入三个控件&#xff0c;对pushButton进行水平布局&#xff0c;之后整体做垂直布局 1.2、按住控件&#xff0c;转到槽&#xff0c;写函数 1.3、打开文件控件 A、首先引入以下两个头文件 B、设置点击打开文件控…

c语言,联合体

一.什么是联合体&#xff1a; 像结构体一样&#xff0c;联合体也是由一个或多个成员变量组成的这些成员变量可以是不同的类型&#xff0c;但编译器只给最大成员分配足够的内存&#xff0c;联合体体内的成员都是公用一块空间的&#xff0c;因此联合体也叫做共同体 二.联合体类…

MySql安装与卸载—我耀学IT

1.MySql安装 打开下载的mysql安装文件mysql-5.5.27-win32.zip&#xff0c;双击解压缩&#xff0c;运行“setup.exe”。 选择安装类型&#xff0c;有“Typical&#xff08;默认&#xff09;”、“Complete&#xff08;完全&#xff09;”、“Custom&#xff08;用户自定义&…

04|调用模型:使用OpenAI API还是微调开源Llama2/ChatGLM?

大语言模型发展史 Transformer是几乎所有预训练模型的核心底层架构。基于Transformer预训练所得的大规模语言模型也被叫做“基础模型”&#xff08;Foundation Model 或Base Model&#xff09;。 在预训练模型出现的早期&#xff0c;BERT毫无疑问是最具代表性的&#xff0c;也…

HTTP 工作流程请求响应 - 面试常问

文章目录 HTTP 工作流程请求和响应格式HTTP请求格式请求行&#xff1a;请求头部字段&#xff1a;空行&#xff1a;消息正文&#xff08;请求正文&#xff09;&#xff1a; HTTP响应格式状态行&#xff1a;响应头部字段&#xff1a;空行&#xff1a; HTTP方法HTTP状态码常用HTTP…

详解基于快速排序算法的qsort的模拟实现

目录 1. 快速排序 1.1 快速排序理论分析 1.2 快速排序的模拟实现 2. qsort的模拟实现 2.1 qsort的理论分析 2.2 qsort的模拟实现 qsort函数是基于快速排序思想设计的可以针对任意数据类型的c语言函数。要对qsort进行模拟实现&#xff0c;首先就要理解快速排序。 1. 快…

Odoo17免费开源ERP开发技巧:如何在表单视图中调用JS类

文/Odoo亚太金牌服务开源智造 老杨 在Odoo最新V17新版中&#xff0c;其突出功能之一是能够构建个性化视图&#xff0c;允许用户以独特的方式与数据互动。本文深入探讨了如何使用 JavaScript 类来呈现表单视图来创建自定义视图。通过学习本教程&#xff0c;你将获得关于开发Odo…

在IDEA中设置使用鼠标滚轮控制字体大小

IDEA是我们常用的程序编程工具&#xff0c;有时为了方便&#xff0c;我们需要随时的调整字体的大小 本篇文章我使用了两种方式来设置IDEA中的字体大小 方式一&#xff1a;使用传统的方式来设置 首先在IDEA顶部的菜单栏中选择“file”菜单 然后在“file”菜单中选择“Setting…

Linux进程通信补充——System V通信

三、System V进程通信 ​ System V是一个单独设计的内核模块&#xff1b; ​ 这套标准的设计不符合Linux下一切皆文件的思想&#xff0c;尽管隶属于文件部分&#xff0c;但是已经是一个独立的模块&#xff0c;并且shmid与文件描述符之间的兼容性做的并不好&#xff0c;网络通…

TCL管理Vivado工程

文章目录 TCL管理Vivado工程1. 项目目录2. 导出脚本文件3. 修改TCL脚本3.1 project.tcl3.2 bd.tcl 4. 工程恢复 TCL管理Vivado工程 工程结构 1. 项目目录 config: 配置文件、coe文件等。doc: 文档fpga: 最后恢复的fpga工程目录ip: ip文件mcs: bit流文件等,方便直接使用src: .…

蓝桥杯物联网竞赛_STM32L071_12_按键中断与串口中断

按键中断&#xff1a; 将按键配置成GPIO_EXTI中断即外部中断 模式有三种上升沿&#xff0c;下降沿&#xff0c;上升沿和下降沿都会中断 external -> 外部的 interrupt -> 打断 trigger -> 触发 detection -> 探测 NVIC中将中断线ENABLE 找接口函数 在接口函数中写…

UE 蓝图场景搭建全流程

点个关注不迷人&#xff0c;可私信帮您解决问题&#xff1a; 学习的知识点&#xff1a; 1、cityEngine 2、bleneder 3、M3工具 4、Uv 基础学习 5、Gameplay 框架 内容很长详情关注&#xff0c;回复ue 获取UE 全流程免费视频教程

OpenCV 单目相机标定

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 单目相机的标定过程与双目相机的标定过程很类似,具体过程如下所述: 1、首先我们需要获取一个已知图形的图像(这里我们使用MATLAB所提供的数据)。 2、找到同名像点(匹配点),这里主要是探测黑白格子之间的角点…

本地虚拟机平台Proxmox VE结合Cpolar内网穿透实现公网远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

【数据挖掘算法与应用】——数据挖掘导论

数据挖掘导论 导入一、为什么要进行数据挖掘1.数据爆炸但知识贫乏2.数据在爆炸式增长3.数据安全4.从商业数据到商业智能的进化5.KDD的出现 二、什么是数据挖掘1.广义技术角度的定义2.狭义技术角度的定义3.商业角度的定义4.数据挖掘与其他科学的关系5.数据挖掘对象6.挖掘到什么知…

数据结构——B树和B+树

数据结构——B树和B树 一、B树1.B树的特征2.B树的插入操作3.B树的删除操作4.B树的缺点 二、B树B树的特征 平衡二叉树或红黑树的查找效率最高&#xff0c;时间复杂度是O(nlogn)。但不适合用来做数据库的索引树。 因为磁盘和内存读写速度有明显的差距&#xff0c;磁盘中存储的数…

[HackMyVM]靶场 Zon

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

Python和R的区别是什么,Python与R的应用场景是什么?

如果你这么问&#xff0c;那么你可能正站在数据科学的起点。对于志在成为数据专业人员的你来说&#xff0c;学习编程是无疑的。我想行你早就听过Python 与R的比较之声&#xff0c;并在选择中感到困惑。在此&#xff0c;我想说&#xff0c;也算是一种安慰吧&#xff1a;对于语言…

利用textarea和white-space实现最简单的文章编辑器 支持缩进和换行

当你遇到一个非常基础的文章发布和展示的需求&#xff0c;只需要保留换行和空格缩进&#xff0c;你是否会犹豫要使用富文本编辑器&#xff1f;实际上这个用原生的标签两步就能搞定&#xff01; 1.直接用textarea当编辑器 textarea本身就可以保存空格和换行符&#xff0c;示例如…

主存中存储单元地址的分配

主存中存储单元地址的分配 为什么写这篇文章? 因为我看书中这部分时&#xff0c;看到下面的计算一下子没反应过来&#xff1a; 知识回顾&#xff08;第1章&#xff09; 计算机系统中&#xff0c;字节是最小的可寻址的存储单位&#xff0c;通常由8个比特&#xff08;bit&…