面试经典150题【81-90】

news2024/9/21 14:49:12

文章目录

  • 面试经典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);
            }
        }
    }

}

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

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

相关文章

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

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

论文笔记:液体管道泄漏综合检测与定位模型

0 简介 An integrated detection and location model for leakages in liquid pipelines 1 摘要 许多液体&#xff0c;如水和油&#xff0c;都是通过管道运输的&#xff0c;在管道中可能发生泄漏&#xff0c;造成能源浪费、环境污染和对人类健康的威胁。本文描述了一种集成的…

C++进阶之路---手撕“红黑树”

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、红黑树的概念与性质 1.概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点…

基于SVM支持向量机的数据预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ........................................................................... Year[2011,2…

总结Dubbo开源RPC框架

一、分布式系统 1.1 集群和分布式 集群&#xff1a;多个机器提供一样的服务&#xff08;实现高性能、高可用、 可伸缩、高可扩展 &#xff09; 分布式&#xff1a;多个机器提供不同的服务&#xff0c;合起来为一个大服务 1.2 架构 二、Dubbo dubbo是一个高性能、轻量级的开…

SQLiteC/C++接口详细介绍sqlite3_stmt类简介

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十八&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;一&#xff09; 预准备语句对象 typedef struct sqlite3_stmt sqlite3_stmt…

Linux docker1--环境及docker安装

一、基础环境要求 Docker分为ce版本&#xff08;免费&#xff0c;试用7个月&#xff09;和ee版本&#xff08;收费&#xff09;。 最低配置要求&#xff1a;64位操作系统&#xff0c;centOS 7及以上&#xff0c;内核版本不低于3.10 二、部署docker 1、查看服务的基础环境是否满…

基于深度学习YOLOv8+Pyqt5的工地安全帽头盔佩戴检测识别系统(源码+跑通说明文件)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;318安全帽 获取完整源码源文件7000张已标注的数据集训练好的模型配置说明文件 可有偿59yuan一对一远程操作配置环境跑通程序 效果展示&#xff08;图片检测批量检测视频检测摄像头检测&#xff09; 基于深度学习YOLOv8Pyqt…

【HTTP】面试题整理

HTTP&#xff1a;什么是队头阻塞以及怎么解决&#xff1f; 队头阻塞&#xff08;Head-of-Line Blocking&#xff09; 计算机网络中的一个概念&#xff0c;特别是在处理HTTP请求时。当多个HTTP请求被发送到一个服务器&#xff0c;并且这些请求被放置在一个队列中等待处理时&…

uniapp微信小程序随机生成canvas-id报错?

uniapp微信小程序随机生成canvas-id报错&#xff1f; 文章目录 uniapp微信小程序随机生成canvas-id报错&#xff1f;效果图遇到问题解决 场景&#xff1a; 子组件&#xff0c;在 mounted 绘制 canvas&#xff1b;App、H5端正常显示&#xff0c;微信小程序报错&#xff1b; 效…

【Map和Set】(二叉搜索树 查找操作 插入操作 删除操作 Map的使用 Map.Entry<K, V> Set的说明)

文章目录 二叉搜索树查找操作插入操作删除操作 Map的使用Map.Entry<K, V> Set的说明 二叉搜索树 二叉搜索树&#xff1a;是空树或者是具有下面性质的二叉树 若左子树不为空,则左子树上所有节点的值都小于根节点的值;若右子树不为空,则右子树上所有节点的值都大于根节点的…

CSS案例-5.margin产品模块练习

效果1 相关数据 整体长&#xff1a;298px&#xff0c;高&#xff1a;415px 效果2 知识点 外边距margin 块级盒子水平居中 条件&#xff1a; 必须有宽度左右外边距设为auto 三种写法&#xff1a; margin-left&#xff1a;auto&#xff1b;margin-right&#xff1a;auto&…

数据可视化-ECharts Html项目实战(3)

在之前的文章中&#xff0c;我们学习了如何创建堆积折线图&#xff0c;饼图以及较难的瀑布图并更改图标标题。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 …

服务器病毒木马通用排查处理应急响应流程

目录 一、勒索病毒发作的特征 二、勒索病毒的应急响应 三、勒索病毒预防与事后加固 一、勒索病毒发作的特征 如果发现大量统一后缀的文件&#xff1b;发现勒索信在Linux/home、/usr等目录&#xff0c;在Windows 桌面或者是被加密文件的文件夹下。如果存在以上特…

01|模型IO:输入提示、调用模型、解析输出

Model I/O 可以把对模型的使用过程拆解成三块&#xff0c;分别是输入提示&#xff08;对应图中的Format&#xff09;、调用模型&#xff08;对应图中的Predict&#xff09;和输出解析&#xff08;对应图中的Parse&#xff09;。这三块形成了一个整体&#xff0c;因此在LangCha…

【Ubuntu】Ubuntu的安装和配置

下载ubuntu镜像 https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-desktop-amd64.iso 一、Ubuntu安装 1.新建虚拟机 1.1按照它的提示创建用户&#xff1b;后面一直下一步就好 2.启动Ubuntu虚拟机 2.1设置为中文键盘 2.2默认即可&#xff1b;若是有低需求也可以选择最小…

YoloV8改进策略:Block改进|焦点调制网络

摘要 FocalNets是一个新型的神经网络架构&#xff0c;它的核心特点是用焦点调制模块完全取代了自注意力&#xff08;SA&#xff09;机制&#xff0c;用于在视觉任务中建模令牌&#xff08;token&#xff09;之间的交互。这种架构的设计旨在提高模型的可解释性&#xff0c;并在…

Tomcat:Session ID保持会话

目录 前言 ​一、部署环境 二、部署nginx反向代理服务器 三、部署tomcat服务器1 四、部署tomcat服务器2 五、客户端测试&#xff08;Session ID不断变动&#xff09; 六、配置Session ID会话保持 七、客户端测试&#xff08;Session ID保持&#xff09; 前言 此次实验…

拌合楼管理系统开发(六) 海康威视摄像头调用拍照

前言&#xff1a;无人值守过磅摄像头拍照 无人值守过程很重要的一个环节就是车辆过磅等车辆到到磅上指定位置后&#xff0c;触发车牌识别&#xff0c;以及车辆前后左右四个方位摄像头拍照&#xff0c;并存入到系统中。 一、支持设备&#xff1a; 建议都采用600万像素以上的海康…

jQuery+CSS3自动轮播焦点图特效源码

jQueryCSS3自动轮播焦点图特效源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 下载地址 jQueryCSS3自动轮播焦点图特效源码