万物的算法日记|第五天

news2024/11/15 9:30:19

笔者自述:

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

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

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

请添加图片描述

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

  1. 使用java中自带的方法去解题

.使用字符串自带的s.indexOf() 和 s.lastIndexOf()可以查到字符出现的第一次位置和最后一次位置,相同的话就说明只出现了一次

  1. 广度优先搜若BFS

什么是广搜? BFS是二叉树,图等数据结构中的遍历算法的一种,思想是从起始点开始,逐层向外扩展,访问尽可能多的节点。
实现方法: 使用队列来保存每一层的节点,按照队列先进先出的原则,一次访问每个节点,并将其未访问过的相邻的节点加入队列中,保证先访问距离起始点近的节点的同时,逐层访问整张图,直到遍历完所有的节点
特点: 适用于无权图或者所有边权相等的图‘;能够搜到的最短路径就是从起点到目标状态的最短路径,同时可以解决最短路径问题;
适用场景:寻找最短路径以及需要遍历全部节点时
方法: isEmpty() poll() 取出队头元素 add() 向队尾添加元素

Queue queue = new LinkedList<>(){{ add(root); }};此处使用了java中的双括号初始化特征

TreeNode 初始化要会写

class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x){
        this.val = x;
    }
}
  1. 队列的简单使用 ,通过对二叉树的三次变形打印练习,对队列的掌握程度会逐步提高。.

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

文章目录

  • 剑指 Offer 50. 第一个只出现一次的字符
  • 剑指 Offer 32 - I. 从上到下打印二叉树
  • 剑指 Offer 32 - II. 从上到下打印二叉树 II
  • 剑指 Offer 32 - III. 从上到下打印二叉树 III

剑指 Offer 50. 第一个只出现一次的字符

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

//第一种方法:暴力解法
    public char firstUniqChar(String s){
        char[] c = s.toCharArray(); //将字符串转化为数组
        for(int i =0;i<c.length;i++){
            boolean res = true;
            for(int j=0;j<c.length;j++){
                 if(j == i){
                     continue;
                 }
                 if(c[i] == c[j]){
                     res= false;
                     break;
                 }
            }
            if(res){
                return c[i];
            }
        }
        return ' ';
    }
    //第二种方法:内置库法
    public char firstUniqChar1(String s){
        for(int i =0;i<s.length();i++){
            if(s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i))){
                return s.charAt(i);
            }
        }
        return ' ';
    }
    //第三种方法:使用hashmap来解决
    public char firstUniqChar2(String s){
        if(s == null || s.length() == 0){
            return ' ';
        }
        Map<Character,Integer> map = new HashMap<>();
        for(int i =0;i<s.length();i++){
            char c = s.charAt(i);
            map.put(c,map.getOrDefault(c,0)+1);
        }
        for(int i =0;i<s.length();i++){
            char c = s.charAt(i);
            if(map.get(c) == 1){
                return c;
            }
        }
        return ' ';
    }

学到的知识:

  1. 这道题我拿到之后,首先想到的是使用hashmap来解决,但是因为hashmap是无序的,我错误的去遍历键来获取值,导致最后拿到的不是题中要求的 ”第一个“,经过修改应该用字符去找对应的键核对值,像方法三那样的
  2. 可以使用字符串自带的s.indexOf() 和 s.lastIndexOf()可以查到字符出现的第一次位置和最后一次位置,相同的话就说明只出现了一次

剑指 Offer 32 - I. 从上到下打印二叉树

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

public int[] levelOrder(TreeNode root){
        //按层遍历 同时可以成为 BFS  BFS 通常借助队列的先进先出的特征来实现
        if(root == null)
            return new int[0];
        Queue<TreeNode> queue = new LinkedList<>(){{ add(root); }};
        ArrayList<Integer> ans = new ArrayList<>();
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            ans.add(node.val);
            if(node.left != null) queue.add(node.left);
            if(node.right != null) queue.add(node.right);
        }
        int[] res= new int[ans.size()];
        for(int i =0;i<ans.size();i++){
            res[i] = ans.get(i);
        }
        return res;

    }

学到的知识点:

  1. 对于二叉树,层次遍历的话就相当于使用BFS(广度优先搜索),对于BFS通常用队列来实现

什么是广搜? BFS是二叉树,图等数据结构中的遍历算法的一种,思想是从起始点开始,逐层向外扩展,访问尽可能多的节点。
实现方法: 使用队列来保存每一层的节点,按照队列先进先出的原则,一次访问每个节点,并将其未访问过的相邻的节点加入队列中,保证先访问距离起始点近的节点的同时,逐层访问整张图,直到遍历完所有的节点
特点: 适用于无权图或者所有边权相等的图‘;能够搜到的最短路径就是从起点到目标状态的最短路径,同时可以解决最短路径问题;
适用场景:寻找最短路径以及需要遍历全部节点时
方法: isEmpty() poll() 取出队头元素 add() 向队尾添加元素

  1. Queue queue = new LinkedList<>(){{ add(root); }};此处使用了java中的双括号初始化特征
  2. TreeNode 初始化要会写
class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x){
        this.val = x;
    }
}

剑指 Offer 32 - II. 从上到下打印二叉树 II

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

public List<List<Integer>> levelOrder(TreeNode root){
        List<List<Integer>> list1 = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        if(root  != null){
            queue.add(root);
        }
        while(!queue.isEmpty() ){
            List<Integer> list = new ArrayList<>();
            for(int i = queue.size();i>0;i--) {
                TreeNode tree = queue.poll();
                list.add(tree.val);
                if (tree.left != null) queue.add(tree.left);
                if (tree.right != null) queue.add(tree.right);
            }
            list1.add(list);
        }
        return list1;
    }

学到的知识:

  1. 为什么队列使用LinkedList 而不使用ArrayLIst 创建,因为LinkedLIst实现了队列的接口,而ArrayList实现了LIst接口,所以在创建队列的时候,一般使用LinkedLIst
  2. 同时LinkedList是一个链式数据结构,他每个元素都包含一个指向前一个元素和后一个元素的指针,这种类型更适合队列的底层实现,同时时间复杂度也非常的低。
  3. 本题相对于上一个二叉树遍历,多的是将每一层都加进到一个列表中,基础原理还是一样的。

剑指 Offer 32 - III. 从上到下打印二叉树 III

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

public List<List<Integer>> levelOrder(TreeNode root){
        Queue<TreeNode> queue = new LinkedList<>();
        List<List<Integer>> res = new ArrayList<>();
        if(root != null) queue.add(root);
        while(! queue.isEmpty()){
            LinkedList<Integer> list = new LinkedList<>();
            for(int i =queue.size();i>0;i--){
                TreeNode tree = queue.poll();
                if(res.size() % 2 == 0) list.addLast(tree.val);
                else list.addFirst(tree.val);
                if(tree.left != null) queue.add(tree.left);
                if(tree.right != null) queue.add(tree.right);
            }
            res.add(list);
        }
        return res;
    }

学到的知识:

  1. 链表的定义其实有三种,一种是LIst,表示可自由切换成LInkedList 和 ArrayList,剩余两种是Arraylist和LinkedList,
  2. 这道题相对于前两个难点在于z字形打印,其实只需要判断总链表中的元素所在的位置通过奇偶位,分别在队列尾部和头部添加元素 ,就可以实现z字形打印,
  3. 其中需要使用LInkedLIst明确是该链表结构才可以使用addLast和addFirst方法

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

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

相关文章

CTFshow-pwn入门-前置基础pwn5 - pwn12

pwn5-pwn12的题目全是关于汇编语言的知识&#xff0c;pwn5-pwn12的汇编文件的代码都是一样的。 我们将可执行文件和汇编文件托到ctfshow-pwn专用虚拟机里&#xff0c;给可执行文件加上执行权限并查看其信息。 32位的&#xff0c;直接扔到ida中去。 在虚拟机中使用cat命令读取下…

SpringBoot的配置文件

SpringBoot的配置文件 &#x1f50e;配置文件的作用&#x1f50e;配置文件的格式&#x1f50e;properties配置文件properties的基本语法读取配置文件 &#x1f50e;yml配置文件yml的基本语法读取配置文件Tips关于 \n&#x1f36d;配置对象&#x1f36d;配置集合&#x1f36d; &…

网络知识点之-DNS协议

域名系统&#xff08;Domain Name System&#xff0c;缩写&#xff1a;DNS&#xff09;是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前&#xff0c;对于每一级域名长度的限制是63个…

4.13 ReentrantLock

相对于 synchronized 它具备如下特点 可中断可以设置超时时间可以设置为公平锁支持多个条件变量 与 synchronized 一样&#xff0c;都支持可重入 基本语法// 获取锁reentrantLock.lock();try{// 临界区} finally{// 释放锁reentrantLock.unlock();}1、可重入 可重入是指同一个…

小程序 抽象节点 selectable 与slot区别

比较 了解了微信小程序的抽象节点组件封装方式之后&#xff0c;觉得与vue的slot使用类似&#xff0c;但也有些区别 &#xff1a; 抽象节点 和 slot 有什么不同&#xff1a; slot只需要你传入一段代码抽象节点需要你传入一个自定义组件&#xff0c;&#xff0c;不是让你只传递…

Kubernetes集群本地连接调试工具KtConnect

一、简介 KtConnect&#xff08;Kt为Kubernetes Toolkit集群工具包的简写&#xff09;是一款基于Kubernetes环境用于提高本地测试联调效率的小工具 Connect&#xff1a;建立数据代理通道&#xff0c;实现本地服务直接访问Kubernetes集群内网&#xff08;包括Pod IP和Service域…

Jetpack Compose教程-水位控制小部件

Jetpack Compose教程-水位控制小部件 Apple的应用程序和小部件一直是设计的典范&#xff0c;也给我们的"复制系列&#xff1a;活动应用"和"卡片应用"提供了灵感。当他们发布了新款苹果手表Ultra时&#xff0c;它里面深度测量小部件的设计引起了我们的兴趣&…

加快奔向“国际数字之都” CDEC2023中国数字智能生态大会走进上海

数智闪耀长三角&#xff0c;风云际会上海滩。 6月14日上午&#xff0c;以汇聚数字产业动能、打造区域合作为主旨的 CDEC2023中国数字智能生态大会上海站活动在浦东软件园创新体验中心举行。 大会以“共建AI智能生态”为主题&#xff0c;吸引致远互联、SAP、浪潮等龙头企业&…

2022年山东省职业院校技能大赛网络搭建与应用赛项网络搭建与安全部署服务器配置及应用

2022年山东省职业院校技能大赛 网络搭建与应用赛项 第二部分 网络搭建与安全部署&服务器配置及应用 竞赛说明&#xff1a; 一、竞赛内容分布 竞赛共分二个模块&#xff0c;其中&#xff1a; 第一模块&#xff1a;网络搭建及安全部署项目 第二模块&#xff1a;服务器…

C#里的var和dynamic区别到底是什么,你真的搞懂了嘛

前言 这个var和dynamic都是不确定的初始化类型&#xff0c;但是这两个本质上的不同。不同在哪儿呢?var编译阶段确定类型&#xff0c;dynamic运行时阶段确定类型。这种说法对不对呢&#xff1f;本篇看下,文章原文地址&#xff1a;在这里 概括 以下详细叙述下这两个(var,dynamic…

CVE-2023-33246命令执行复现分析

简介 RocketMQ是一款低延迟、高并发、高可用、高可靠的分布式消息中间件。既可为分布式应用系统提供异步解耦和削峰填谷的能力&#xff0c;同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。 影响版本 <RocketMQ 5.1.0 <RocketMQ 4.9.5 环境搭建 docker…

Leetcode 剑指 Offer II 031. 最近最少使用缓存

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 运用所掌握的数据结构&#xff0c;设计和实现一个 LRU (Least Re…

Python 类型检测:isinstance() 与 type()

文章目录 参考描述面向对象编程概念类与实例继承super() 与代理对象方法的自动继承属性的继承 isinstance 与 type 内置函数isinstance()可迭代对象仅能为元组可能产生的 TypeError嵌套的元组 typeisinstance() 与 type() 的区别 参考 项目描述Python 官方文档https://docs.py…

【C语言初阶】分支语句If与switch的具体用法,有这篇博客就够了

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,这里是君兮_,今天又来给大家更新0基础学习C语言中的文章啦&#xff01; 今天带来的是对分支语句的详解&#xff0c;初学者建议先看看总集哦, 这里是链接: 【C语言初阶】万字解析,带你0基础快速入门C语言(上) 【C语…

图片转excel表格算法之霍夫变换法原理浅析

大家伙都知道&#xff0c;图片转excel表格是金鸣识别中一项非常重要的功能&#xff0c;金鸣识别的OCR在识别图片中的表格时&#xff0c;会用到一种叫霍夫变换法的算法&#xff0c;那这个算法到底是怎么回事&#xff1f;它的原理又是什么呢&#xff1f; 一、霍夫变换法的概念 …

深入了解模板知识(c++)

前言 在c中模板是很重的&#xff0c;泛型编程就是模板最好的体现&#xff0c;模板的出现就是为了更好的复用代码&#xff0c;有了它&#xff0c;我们不必写各种逻辑相同只是逻辑中的数据的类型的不同的代码&#xff0c;使得我们编写代码变得更加高效&#xff0c;下面让我们一起…

若依权限系统分析(前后端分离版)

若依权限系统分析 一&#xff1a;故事背景二&#xff1a;具体权限控制2.1 页面权限控制2.2 页面元素权限控制 三&#xff1a;实现前端鉴权3.1 封装js与权限交互3.1.1 uni-app自带uni-request与权限交互 3.2 vux状态管理3.2.1 自定义状态3.2.2 在vuex的store配置内添加我们新增的…

rust切片

这里s的不可变引用借用给了wordIndex&#xff0c;而s.clear()又想用可变引用&#xff0c;所以报错。而第一个例子中返回的usize并没有返回不可变引用。

客户端负载均衡工具Ribbon

一 什么是Ribbon Ribbon介绍 目前主流的负载方案分为以下两种&#xff1a; 集中式负载均衡&#xff0c;在消费者和服务提供方中间使用独立的代理方式进行负载&#xff0c;有硬件的&#xff08;比如 F5&#xff09;&#xff0c;也有软件的&#xff08;比如 Nginx&#xff09;…

Ubuntu系统中分布式安装配置HBase-2.3.7

HBase是一个基于Hadoop的分布式列式数据库&#xff0c;可以存储海量的结构化和半结构化数据。本文介绍如何在三个Ubuntu系统上搭建一个HBase集群&#xff0c;并进行简单的数据操作。 在三个Ubuntu系统上分布式安装配置HBase-2.3.7&#xff0c;主要步骤包括&#xff1a; 准备工…