万物的算法日记|第三天

news2024/11/25 6:59:08

笔者自述:

一直有一个声音也一直能听到身边的大佬经常说,要把算法学习搞好,一定要重视平时的算法学习,虽然每天也在学算法,但是感觉自己一直在假装努力表面功夫骗了自己,没有规划好自己的算法学习和总结,因为后半年也该找实习了,所以每日的算法题要进行恶补,勤能补拙,因此有了这一个算法日记系列;

必读: 大佬你好,感谢您的阅读,这篇文章是我的算法笔记,方便我每日回顾;
为了不耽误您的时间,我把本篇日记的考点方向和算法知识总结列出来,如果对您有需要要就进行阅读

也希望对您有帮助,和您一起通关算法!致谢

请添加图片描述

算法语言:java
题目来源:力扣–书本–初级算法,可以在力扣中搜索相关题名找到更多解法和大神方法
本文知识点:

  1. 使用LInkedList模拟栈
    因为LInkedList内实现了栈数据结构的所有基本方法,例如addLast(),removeLast()等,同时也支持在任意位置进行插入,删除和读取操作。

addLast(E e):将元素添加到链表末尾,相当于将元素压入栈顶。
removeLast():从链表末尾删除一个元素,相当于弹出栈顶元素。
getLast():获得链表末尾的元素,相当于读取栈顶元素。 创建栈:

LinkedList<Integer> stack = new LinkedList<>(); 创建栈,
stack.addLast(1); 将1入栈
int top = stack.removeLast(); 将 1出栈,并赋值给 top
int top = stack.getLast(); 获得栈顶元素,即 1
stack.add(1, 4); 在栈中的第二个位置插入元素 4
stack.remove(1);删除栈中的第二个元素

  1. 哈希表的简单使用
    为什么会想到使用哈希表解决?
    原因:我们要保证复制出来的新链表中节点的random指针指向正确,需要使用一种方法来将原链表中的每个节点与其新表中对应的节点建立映射关系,方便后续在复制random时,找到对应关系
    哈希表:适合存储键值对对应关系,适用场景:快速查找,增删操作,当数据规模大的时候,性能优于数组和链表
  2. 学会使用StringBuilder对字符串类型进行处理
    什么是StringBuilder: 具有修改String的能力,相对于直接使用String对象,避免了不必要的内存开销
    适用场景:需要频繁对字符串拼接或者修改的情况下使用,避免了频繁创建对象的开销,性能更好
    方法:
    StringBuilder(): 无参构造方法,创建一个空的StringBuilder对象
    appen():向StringBuilder对象的末尾添加指定的数据
    insert() 向指定位置插入数据
    delete() 删除指定位置的数据
    replace() 替换指定位置的数据
    reverse() 将对象中的顺序颠倒
    lenth() 获取StringBuilder对象中的长度

切记:最后需要转化成对应的输出类型。:

详细可针对具体题目具体分析~~

文章目录

  • 剑指Offer06.从尾到头打印链表
  • 剑指Offer24.反转链表
  • 剑指 Offer 35. 复杂链表的复制
  • 剑指Offer 05.替换空格
  • 剑指 Offer 58 II. 左旋转字符串

剑指Offer06.从尾到头打印链表

在这里插入图片描述
代码:

public class day6_14_0_update {
    //递归思路 递归到尾部 然后进行回溯
    //代码非常的简单,而且也容易理解
    ArrayList<Integer> tmp = new ArrayList<>();
    public int[] reversePrint(ListNode head){
        recur(head);
        int[] res = new int[tmp.size()];
        for(int i =0;i<res.length;i++)
            res[i] = tmp.get(i);
        return res;
    }
    //通过递归到链表尾部,如果是空的话,就一层一层回溯,就实现了将尾部值依次添加到链表中
    public void recur(ListNode head){
        if(head == null)
            return;
        recur(head.next);
        tmp.add(head.val);
    }
//-------------------------------------------------------------------
    //使用辅助栈来 栈的特性 先进后出 使用LinkedList 来模拟栈
    public int[] reversePrint1(ListNode head){
        LinkedList<Integer> stack = new LinkedList<Integer>();
        while(head != null){
            stack.addLast(head.val);
            head = head.next;
        }
        int [] res = new int[stack.size()];
        for(int i =0;i<res.length;i++){
            res[i] = stack.removeLast();
        }
        return res;
    }
}

学到的知识:

  1. 之前的文章也说过了ArrayList和LInked的底层原理区别和对应的适用场景。
    通过LInkedList模拟栈,因为LInkedList内实现了栈数据结构的所有基本方法,例如addLast(),removeLast()等,同时也支持在任意位置进行插入,删除和读取操作。

addLast(E e):将元素添加到链表末尾,相当于将元素压入栈顶。
removeLast():从链表末尾删除一个元素,相当于弹出栈顶元素。
getLast():获得链表末尾的元素,相当于读取栈顶元素。 创建栈:

LinkedList<Integer> stack = new LinkedList<>(); 创建栈,
stack.addLast(1); 将1入栈
int top = stack.removeLast(); 将 1出栈,并赋值给 top
int top = stack.getLast(); 获得栈顶元素,即 1
stack.add(1, 4); 在栈中的第二个位置插入元素 4
stack.remove(1);删除栈中的第二个元素

剑指Offer24.反转链表

在这里插入图片描述
代码:


public class day6_14_1 {
    //反转链表
    //遍历 : 从头开始 直接修改指针指向
    public ListNode reverseList(ListNode head){
        ListNode cur = head,pre = null;
        while(cur!= null){
            ListNode temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur= temp;
        }
        return pre;
    }

    //递归回溯
    public ListNode reverseList1(ListNode head){
        return recur(head,null);
    }
    public ListNode recur(ListNode cur,ListNode pre){
        if(cur == null) return pre; //终止条件
        ListNode res = recur(cur.next,cur); //递归后继节点
        cur.next = pre; // 修改节点引用指向
        return res;  // 返回反转链表的头节点
    }

}

学到的知识:

  1. 递归的简单入门,递归的思路很简洁,要代码实现正确难一点,需要多练习和理解

剑指 Offer 35. 复杂链表的复制

在这里插入图片描述
首先我们先看一下简单的链表复制操作:

//简单的链表复制
    public Node copyEasyList(Node head){
        Node cur = head;
        Node dum = new Node(0),pre = dum;
        while(cur != null){
            Node node = new Node(cur.val);
            pre.next = node;
            cur = cur.next;
            pre = node;
        }
        return dum.next;
    }

理解了这一步,对于下面的复杂链表复制,只需要搞懂两个循环内部意思即可
代码:

/*
// Definition for a Node.
class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
*/
class Solution {
    public Node copyRandomList(Node head){
        if(head == null){
            return null;
        }
        Node cur = head;
        //使用哈希表来进行存储节点信息
        Map<Node,Node> map = new HashMap<Node,Node>();
        //复制各节点,并建立 原节点- 新节点的map映射
        while(cur != null){
            map.put(cur,new Node(cur.val));
            cur =cur.next;
        }
        cur = head;
        while(cur != null){
            map.get(cur).next = map.get(cur.next);
            map.get(cur).random = map.get(cur.random);
            cur =cur.next;
        }
        return map.get(head);
    }
}

学到的知识点: 这题感觉挺难的,对我而言 哈哈

  1. 我之前错误的认为链表中的两个元素之间的指向是真实存在的哈哈,其实只是为了方便假象的。对于第二个while循环内的随机数赋值操作,其实可以理解成 赋值后就完成了对应的指针指向。
  2. 为什么会想到使用哈希表解决?
    原因:我们要保证复制出来的新链表中节点的random指针指向正确,需要使用一种方法来将原链表中的每个节点与其新表中对应的节点建立映射关系,方便后续在复制random时,找到对应关系
    哈希表:适合存储键值对对应关系,适用场景:快速查找,增删操作,当数据规模大的时候,性能优于数组和链表

剑指Offer 05.替换空格

在这里插入图片描述
代码:

public class day6_14_3 {
    // 拆分字符,遇见空格替换 时间复杂度为O(n)
    public String replaceSpace(String s){
        String a ="";
        for(int i =0;i<s.length();i++){
            if(s.charAt(i) == ' '){
                a+="%20";
                continue;
            }
            a+=s.charAt(i);
        }
        return a;
    }
    //使用 StringBuilder 来进行修改
    public String replaceSpace1(String s){
        StringBuilder res = new StringBuilder();
        for(Character c: s.toCharArray()){
            if(c == ' ')
                res.append("%20");
            else
                res.append(c);
        }
        return res.toString();
    }
    //直接使用API中的方法
    public String replaceSpace2(String s){
        return s.replace(" ","%20");
    }
}

学到的知识:

  1. s.charAt(i) 可以提取字符串中的固定位置字符
  2. 学会使用StringBuilder对字符串类型进行处理
    什么是StringBuilder: 具有修改String的能力,相对于直接使用String对象,避免了不必要的内存开销
    适用场景:需要频繁对字符串拼接或者修改的情况下使用,避免了频繁创建对象的开销,性能更好
    方法:
    StringBuilder(): 无参构造方法,创建一个空的StringBuilder对象
    appen():向StringBuilder对象的末尾添加指定的数据
    insert() 向指定位置插入数据
    delete() 删除指定位置的数据
    replace() 替换指定位置的数据
    reverse() 将对象中的顺序颠倒
    lenth() 获取StringBuilder对象中的长度

切记:最后需要转化成对应的输出类型。

  1. 记住一些API自带的一些方法,可以省去很多时间,s.replace(" “,”%20"),将A替换成B

剑指 Offer 58 II. 左旋转字符串

在这里插入图片描述

代码:


public class day6_14_4 {
    //简陋的实现方法 时间复杂度高
    public String reverseLeftWords(String s,int n){
        String a = "";
        String b = "";
        for(int i =0;i<n;i++){
            a += s.charAt(i);
        }
        b = s.replace(a,"");
        return b+a;
    }
    //使用StringBuilder
    public String reverseLeftWords1(String s ,int n){
        StringBuilder sh = new StringBuilder(s);
        for(int i =0;i<n;i++){
            sh.append(s.charAt(i));
            sh.deleteCharAt(0);
        }
        return  sh.toString();
    }
    //利用字符串切割操作
    public String reverseLeftWords2(String s,int n){
        return s.substring(n,s.length())+s.substring(0,n);
    }
}

学到的知识:

  1. 可以使用字符串自带的方法去切割,使用StringBuilder()来进行添加修改,以及使用列表或者二倍字符串来进行分隔等等,都可以实现,当做练手题目。

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

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

相关文章

FasterTransformer 001 start up

FasterTransformer Faster Transformer是一个Transformer单层前向计算的高效实现。一个函数由多个OP组合实现。每一个基本OP都会对应一次GPU kernel的调用&#xff0c;和多次显存读写。OP融合可以降低GPU调度和显存读写&#xff0c;进而提升性能。在Faster Transformer&#x…

位姿估计 | 目标体坐标系相对于相机坐标系的位姿估计及其Python代码

目录 引言技术流程1. PNP介绍2. ICP介绍a. 利用ICP求解目标相对相机的位姿b. 利用ICP求解相机帧间运动 Python代码 引言 本文接着分享空间目标位姿跟踪和滤波算法中用到的一些常用内容&#xff0c;希望为后来者减少一些基础性内容的工作时间。以往分享总结见文章&#xff1a;位…

Redis 之Jedis 加springboot整合Redis

Jedis API 文档 在线文档: https://www.mklab.cn/onlineapi/jedis/ Jedis 介绍 Jedis 工作示意图 Java 程序操作Redis 的工具 示意图 Jedis 操作Redis 数据 快速入门 创建maven 项目 注意二步是路径配置自己想放哪里 三步是 定义包的层次结构 嫌弃麻烦的也可以不设置 …

chatgpt赋能python:Python编程技巧:如何横着打印差数列

Python编程技巧&#xff1a;如何横着打印差数列 随着互联网时代的到来&#xff0c;SEO已成为企业推广和营销的重要手段。而作为一名具有10年Python编程经验的工程师&#xff0c;我发现Python编程技巧的学习和应用也可以帮助企业优化SEO排名。本文将从实际项目需求出发&#xf…

如何实现Http请求报头的自动转发之设计

HeaderForwarder组件不仅能够从当前接收请求提取指定的HTTP报头&#xff0c;并自动将其添加到任何一个通过HttpClient发出的请求中&#xff0c;它同时也提供了一种基于Context/ContextScope的编程模式是我们可以很方便地将任何报头添加到指定范围内的所有由HttpClient发出的请求…

基于Java家政服务网站系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

opencv人与摄像头距离、角度检测

参考&#xff1a; https://chtseng.wordpress.com/2018/09/18/%E5%A6%82%E4%BD%95%E4%BC%B0%E7%AE%97%E5%89%8D%E6%96%B9%E4%BA%BA%E7%89%A9%E7%9A%84%E8%B7%9D%E9%9B%A2/ WeChat_20230611160620 1、cv2加载摄像头慢解决方法&#xff0c;单独重新cv2.VideoCapture() https://b…

新《终结者》电影剧本或交由 ChatGPT 书写

据外媒报道&#xff0c;詹姆斯・卡梅隆透露他正在创作下一部《终结者》电影的剧本&#xff0c;他同时表示新剧本的灵感得益于 OpenAI 的 ChatGPT。 打开豆瓣&#xff0c;1984年10月上映的那部「终结者」评分依然在8分以上。而后&#xff0c;终结者系列的电影不断上新&#xff…

基于Java房屋租售网站设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

考研计算机组成思维导图总结(408,833,834)

需要思维导图文件和图片的可以去我的Github上寻找&#xff0c;这份思维导图参考23年王道机组&#xff0c;同时添加了一部分833&#xff0c;834需要知识点。 注意&#xff1a;最后的机组知识点仍要以学院进行对照&#xff0c;这里只是提供参考 思维导图pdf和知识点图片 文章目…

<Linux> 《SUSE Linux 中SSH安全加固》

《SUSE Linux 中SSH安全加固》 1 说明2 安全加固2.1 更改 ssh 默认端口2.2 限制 ROOT 远程登陆2.3 修改默认登录时间2.4 升级旧版本2.5 当用户处于非活动时断线2.6 修改加密协议版本2.7 限制 IP 登录2.8 允许或禁止指定用户和组登录2.9 限制监听 IP2.10 最后修改配置文件的属性…

【JVM 监控工具】JVisualVM的使用

文章目录 前言二、启动JVisualVM三、安装插件四、使用 前言 JVisualVM是一个Java虚拟机的监控工具&#xff0c;要是需要对JVM的性能进行监控可以使用这个工具哦 使用这个工具&#xff0c;你就可以监控到java虚拟机的gc过程了 那么&#xff0c;这么强大的工具怎么下载呢&…

【HBZ分享】FactoryBean的应用 与 BeanFactroyPostProcessor的应用 与 BeanPostProcesser的应用

FactoryBean的应用实战 需要写一个A类来实现FactoryBean实现FactoryBean的3个方法&#xff0c;即getOject(), getObjectType(), isSingleton()注意&#xff1a;在通过xml的【 】标签或者通过注解方式将A类注入容器的时候&#xff0c;返回的实例不是A类&#xff0c;而是T类&…

HTML 基础

目录 HTML 结构 1.认识 HTML 标签 HTML 文件基本结构 标签层次结构 HTML 常见标签 注释标签 标题标签: h1-h6 段落标签: p 换行标签: br 格式化标签 图片标签: img 关于目录结构: 超链接标签: a 链接的几种形式: 表格标签 合并单元格 列表标签 表单标签 form …

【头歌-Python】Python第九章作业(初级)第 1、2、4 关

第1关&#xff1a;绘制温度曲线 任务描述 附件中是某月每天的最高温度和最低温度数据&#xff0c;请绘制本月的高温曲线&#xff08;红色、圆点标记坐标&#xff09;和低温曲线&#xff08;蓝色、星号标记坐标&#xff09;&#xff0c;线型、刻度如输出示例所示&#xff0c;线…

Rust每日一练(Leetday0031) 解码方法、复原 IP 地址

目录 91. 解码方法 Decode Ways &#x1f31f;&#x1f31f; 93. 复原 IP 地址 Restore IP Addresses &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 91. …

chatgpt赋能python:Python如何求平均

Python如何求平均 Python是一种非常流行的编程语言&#xff0c;它被广泛应用于各种领域&#xff0c;包括科学计算、数据分析、Web开发等。在这篇文章中&#xff0c;我们将介绍如何使用Python求平均值。 什么是平均数 平均数&#xff0c;也称为均值&#xff0c;是指一组数据的…

chatgpt赋能python:Python怎么求平均值?全面解析平均值计算方法

Python怎么求平均值&#xff1f;全面解析平均值计算方法 作为一种简洁易用的计算机编程语言&#xff0c;Python的应用范围已经越来越广泛。在Python中&#xff0c;我们可以轻松地进行各种统计和计算工作&#xff0c;其中求平均值是最常见的计算之一。在本文中&#xff0c;我们…

Redis过期策略

Redis 使用的过期删除策略是什么&#xff1f; Redis 是可以对 key 设置过期时间的&#xff0c;因此需要有相应的机制将已过期的键值对删除&#xff0c;而做这个工作的就是过期键值删除策略。 每当我们对一个 key 设置了过期时间时&#xff0c;Redis 会把该 key 带上过期时间存…