11 2024 档案
摘要:一、服务工作原理和配置 1.1 介绍 通过加密技术,提供一个安全的远程登录方式,以及其他网络服务的加密通道。 核心功能 远程登录 文件传输 端口转发:SSH可以通过本地或远程端口转发实现隧道功能,帮助用户在受限网络中传输数据。 加密通信:所有通过SSH传输的数据都被加密,防止中间人攻击和数据泄露。
阅读全文
摘要:一、显示数据 1.1 理解输入和输出 标准文件描述符 0 STDIN 标准输入 就是从键盘(通常是/dev/tty)获取数据。 使用重定向时,会使用重定向指定的文件来替换STDIN 1 STDOUT 标准输出 就是输出到终端显示器(一般是/dev/tty) 使用重定向时,可以将输出到指定的文件中。
阅读全文
摘要:一、构建基本脚本 1.1 使用多个命令 两个命令一起运行,放在同一行,用;隔开,例如pwd; ls 1.2 创建shell脚本 在创建shell脚本文件时,必须在文件的第一行指定要使用的shell。其格式为:#!/bin/bash 井号(#)用作注释行。shell并不会处理shell脚本中的注释行。
阅读全文
摘要:一、基础 编辑文件vim 文件名 如果存在则编辑,如果不存在则先创建 三种模式 普通模式 刚打开文件就是普通模式 移动:h左移一个字符,j下移一行,k上移一行,l右移一行,也可以使用方向键,前提时定义了方向键的终端。 快速移动:Ctrl + F下翻一屏,Ctrl + B上翻一屏,G移动到缓冲区最后一
阅读全文
摘要:一、包管理 包管理系统利用一个数据库来记录各种相关内容 系统上安装了什么软件包 每个包安装了什么文件 每个已安装软件包的版本 包管理系统会检测依赖关系,并在安装需要的包之前,先安装好所依赖的软件包 基于Debian的发行版使用dpkg命令与包管理系统交互,基于Red Hat的发行版使用rpm命令 二
阅读全文
摘要:一、基本文件系统 1.1 ext文件系统 使用虚拟目录来操作硬件设备,在物理设备上按定长的块来存储数据。 使用“索引节点”来存放虚拟目录中所存储文件的信息。 每个物理设备都有一个索引节点表,存储在虚拟目录中的每一个文件在索引节点表中都有一个条目。 通过索引节点号,就可以在索引节点表中找到具体的索引节
阅读全文
摘要:一、Linux的安全性 用户权限是通过创建用户时分配的用户ID(User ID,通常缩写为UID)来跟踪的。UID是数值,每个用户都有唯一的UID 在登录系统时用的不是UID,而是登录名。登录名是用户用来登录系统的最长八字符的字符串,同时会关联一个对应的密码。 1.1 /etc/passwd文件 L
阅读全文
摘要:一、全局环境变量 全局环境变量对于所有shell会话和生成的子shell都是可见。 查看所有全局变量env 查看某个全局变量printenv HISTSIZE 创建全局变量 先创建局部变量my_variable="ouyang" 然后export my_variable 父shell 创建全局环境变
阅读全文
摘要:1.1 进程列表 可以在一行,指定依次运行的一系列命令,如pwd; ls。但是这不是进程列表。 进程列表需要用括号包裹起来,如(pwd; ls),进程列表是创建子shell进行运行。 $BASH_SUBSHELL,返回0,则表示没有创建子shell。 1.2 后台模式 在命令的末尾加入& sleep
阅读全文
摘要:二、进阶命令 2.1 ps命令 作用:监测进程。 ps aux:显示所有用户的进程 可以看见CPU使用率,内存使用率、进程状态 ps -ef系统上运行的所有进程 可以看见PPID 一些信息 UID:启动这些进程的用户。 PID:进程的进程ID。 PPID:父进程的进程号(如果该进程是由另一个进程启动
阅读全文
摘要:一、基本命令 1.1 man手册 基本使用 man 具体命令 空格翻页,回车下一页 q退出 man内容分区 1:可执行程序或shell命令 2:系统调用 3:库调用 4:特殊文件 5:文件格式与约定 6:游戏 7:概览、约定及杂项 8:超级用户和系统管理员命令 9:内核例程 可以使用man 7 ho
阅读全文
摘要:[题目链接](661. 图片平滑器 - 力扣(LeetCode)) 解题思路 题目不难,关键是怎么写得【优雅】 一般这种枚举的题,我们可以定义一个【方向】数组,然后直接for循环遍历这个【方向】数组,代码会更优雅,直接看代码 代码 class Solution { public: vector<ve
阅读全文
摘要:题目链接 解题思路 用双指针,或者辅助数组的方法这里就不过多解释了,现在说最优解。 我们可以利用两个数组「有序」的特点,找到其中位数。 直接举例子,假设其中一个数组nums1是[1, 3, 5, 7, 9],另一个数组nums2是[2, 4, 6, 8],中位数我们先人工算出来,是5,也就是整体的第
阅读全文
摘要:题目链接 解题思路 子串问题,思考,「以i开头」结果是什么,求出所有的结果,然后最长的那个就是答案。或者「以i结尾」结果是什么,求出所有的结果,最长的那个就是答案。 本题使用「以i开头」结果是什么。 当求出i开头的结果是[i, j],那么怎么求i+1的结果?其实就是滑动窗口。现在的窗口是[i, j]
阅读全文
摘要:题目链接 解题思路 一道回溯的题目。 我现在在[i, j],然后处理到单词的index位置,index之前的都已经解决了,现在要往哪走?很明显如果[i + 1, j]的位置等于index的单词,我可以去「试试」能不能走通。所以其实很简单,每当来到[i, j],单词index,我就看上下左右四个位置,
阅读全文
摘要:题目链接 解题思路: 对于这类递归问题,采用「宏观」思考模式。 对于任意一个节点A,左子树先「展开为链表」,右子树再「展开为链表」,然后A节点,将左子树的结果,和右子树的结果,「串在一起」即可。 左子树展开为链表,所以要返回两个节点,一个是链表的头,然后是链表的尾。 代码 /** * Definit
阅读全文
摘要:题目链接 解题思路 分情况讨论即可 两个头都是空,直接返回空 若root1为空,直接返回root2 若roo2为空,直接返回root1 若都不空,则二者相加,得到一个新节点A,然后二者的左子树去合并,得到一个新左子树new_left,二者的右子树去合并,得到一个新右子树new_right,然后新节点
阅读全文
摘要:题目链接 解题思路 普通的递归可能很简单,但是,现在要求,使用「二叉树递归套路」来思考问题 每个节点需要什么信息?如果根节点,能够有一个「最大深度」的信息,那么直接返回就可以了。那么,这个信息可以通过左子树信息 + 右子树信息 得到吗? max(左子树最大深度, 右子树最大深度) + 1,就是该节点
阅读全文
摘要:题目链接 解题思路 这种二叉树的题目,绝大部分可以用「二叉树的递归套路」来解决,那么什么是「二叉树的递归套路」?其实就是每个节点会有信息,该节点信息怎么来的?左儿子的信息 + 右儿子的信息 ,然后加工成自己的信息。 根结点是否是搜索二叉树?需要左儿子和右儿子给什么信息? 首先要知道左子树和右子树,是
阅读全文
摘要:题目链接 解题思路 层序遍历就是用队列,本题需要一层一层收集答案,所以我们可以用一个变量cur,表示该层还剩多少节点需要收集,同时,遇到一个节点,还要将其孩子节点放入队尾。那么我们怎么知道下一层的节点个数,所以还需要一个变量next,记录下一层的节点个数。 总结一遍:每次从队头拿出一个节点A,然后把
阅读全文
摘要:题目链接 递归版本很简单,这里就不过多介绍,接下来使用非递归版本,就是使用栈,并且是前、中、后序遍历,统一一套逻辑的非递归的二叉树遍历。 中序遍历:遍历顺序是,左中右,不能使用递归,那我们就要自己使用栈来保存「现场」。当来到一个节点时,第一次来到,不能够输出,要先将左子树的内容全部得到后,再输出该节
阅读全文
摘要:七、文件操作 7.1 文件打开和关闭 打开文件open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) file:文件路径 mode:文件打开模式 文
阅读全文
摘要:六、异常处理 基本语法 try: # 尝试运行的代码块 result = 10 / 0 except ZeroDivisionError as e: # 捕获 ZeroDivisionError 异常 print("不能除以零!", e) except TypeError as e: print("
阅读全文
摘要:五、类 5.1 定义类 使用 class 关键字定义一个类,类名通常采用首字母大写的驼峰命名法class Person: pass 5.2 构造函数 基本语法 class Person: def __init__(self, name, age): # 定义构造函数 self.name = name
阅读全文
摘要:二、模块 模块是什么?模块就是一个.py文件,可以定义函数、类和变量,模块内也可能包含可执行的代码。 模块的作用 代码重用:模块可以将代码划分为更小的单元,方便在其他文件中重复使用。 组织和结构化代码:模块帮助将大型代码库分解成逻辑单元,使代码结构更清晰。 避免命名冲突:模块引入了命名空间机制,可以
阅读全文
摘要:一、入门 1.1 注释 单行注释# 多行注释 ''' 多行注释 ''' """ 多行注释 """ 指定文件的编码方式 必须在第一行才有效# coding:gbk 1.2 格式化输出 print中,使用% print("姓名:%s, 年龄: %d, 成绩:%.2f" % (name, age, sco
阅读全文
摘要:使用的是mac+vscode 首先使用Homebrew 安装python解释器,打开终端,运行brew install python 使用python3 --version以及pip3 --version检查是否安装成功 vscode安装插件 运行以及调试
阅读全文
摘要:题目链接 解题思路 小字符串不满足了,那么包含此小字符串的大字符串肯定不满足。 大字符串满足,那么该字符串的所有子串都满足条件。所以,我们就可以把问题转成,「以i开头的字符串,满足条件的,最长多长?」然后再根据这个结果,计算以i开头的所有子串数目即可。 计算了「以i开头的最长的结果」,怎么计算「以i
阅读全文
摘要:题目链接 解题思路 这个题和戳气球有相同的思想,戳气球是以「最后戳哪个气球」组织答案,这个题是,「先切哪个」组织答案 戳气球 代码 class Solution { public: // [L, R]上,怎么切? int process(vector<int> &cuts, int L, int R
阅读全文
摘要:题目链接 解题思路 暴力递归,一个很容易想到的方法就是,「先戳哪个气球」,process(L, R),[L, R]上,返回能得到的最大硬币数目。 一个for循环,枚举,「先戳哪个气球」,但是有问题,假如先戳i号气球,接下来的递归怎么调用?process(L, i - 1) + process(i +
阅读全文
摘要:题目链接 解题思路 检查一个二叉树是否轴对称,其实和根结点无关,而是和其左右子树有关。 左子树头等于右子树头,然后递归调用,「左子树的右儿子」要等于「右子树的左儿子」并且「左子树的左儿子」要等于「右子树的左儿子」。 代码 /** * Definition for a binary tree node
阅读全文
摘要:题目链接 解题思路 暴力怎么做?n个节点,我们要先选头节点i,头节点选中之后,左子树的节点数就决定了,右子树的节点数也就决定了,所以选择头节点i后,不同的数目是左子树不同数目 * 右子树不同数目,这又是子问题了,又可以递归得到结果。 有一个细节,假设n等于5,1,2,3,4,5,假设现在选择了3为头
阅读全文
摘要:题目链接 解题思路 暴力怎么做?我们可以枚举, 矩阵的底,必须是第0行,求一个最大值,矩阵的底,必须是第1行,求一个最大值,把所有的都得到,然后最大的那个,就是结果。 依次类推,所有结果的最大值,就是全局最优解 举个例子,假设矩阵 [ [1, 0, 1, 0, 0], [1, 0, 1, 1, 1]
阅读全文
摘要:题目链接 解题思路: 题目乍一看没有思路,那我们来想一想如果暴力求解怎么办。最大的矩形,他总有一个高(竖着的),然后有一个宽(横着的),那我们就暴力求解每一个高,也就是每一个下标i,对应的heights[i],最大的宽是多少,然后求出所有的解后,最优的便是结果。 怎么求解以heights[i]为高,
阅读全文
摘要:题目链接 解题思路: 方法一:两个for循环,时间复杂度:O(n^2) 方法二:先排序,然后双指针,时间复杂度:O(n * logn) 方法三:使用一个set,从左往右遍历,每次遍历到一个数num,先查找set,是否存在target - num的数,如果存在,直接返回了。时间复杂度:O(n)。 因为
阅读全文
摘要:题目链接 解题思路 从左往右的尝试,暴力递归(回溯),process(index, path),来到index,两种情况,要index的数,或者不要index的数 代码 class Solution { public: void process(vector<vector<int>> &ans, c
阅读全文
摘要:题目链接 解题思路 求最小子串问题,第一时间,想「以i开头的结果是什么」,求出所有的结果,最优的便是;或者「以i结尾的结果是什么」,求出所有的结果,最优的便是 这个题使用「以i开头的结果是什么」,假设是[i, j]然后再求i+1的结果时,我们发现,只需要把i位置的字符去掉,就可以知道是否满足结果,如
阅读全文
摘要:题目链接 这就是「荷兰国旗」问题,把颜色分成左边红色、中间白色、右边蓝色的顺序,实现快排的一部分步骤。 解题思路 我们可以有一个left_border变量,表示[0, left_border]都是红色,同时,一个right_border变量,[right_border, n - 1]都是蓝色,那么[
阅读全文
摘要:题目链接 本题使用的是快排解决。 思路:「荷兰国旗」问题,具体思路跳转75. 颜色分类 代码 class Solution { public: void swap(vector<int>& nums, int i, int j) { int tmp = nums[i]; nums[i] = nums
阅读全文
摘要:题目链接 解题思路 直接暴力递归,process(i, j):word1[i...]转换成word2[j...]需要的最少操作次数,也就是说,i字符之前的不用处理了,已经变成了j字符之前的了。 如果word1[i] == word2[j] 可以什么操作都不干,i和j就完成了,所以返回process(
阅读全文
摘要:题目链接 这道题目与62.不同路径很像,来到[i, j]位置,只能向下,或者向右走,只不过改题是要求总和最小。 process(i, j):当前在[i, j]位置,返回最小路径和 所以当在[i, j],如果还能往下走,一种答案就是process(i + 1, j) + grid[i][j] 如果还能
阅读全文
摘要:题目链接 解题思路 方法一:暴力递归,process(i, j),当前在[i, j]位置,到达右下角有多少种方法? 如果i < m - 1,那么可以往下走,所以结果加process(i + 1, j) 如果j < n - 1,那么可以往右走,所以结果加process(i, j + 1) 因为只有两个
阅读全文
摘要:题目链接 解题思路 最大子数组问题,有两个基本的想法,以i开头的子数组结果是怎样的,求出所有的结果,最优的那个,就是答案;以i结尾的子数组结果是怎样的,求出所有的结果,最优的那个,就是答案。 本题我们可以考虑,「以i结尾的结果是怎样的」,为啥?因为我们要求的是最大的累加和,我们求出了res1=「以i
阅读全文
摘要:题目链接 解题思路 方法一:(注:这种方法过不了,提供一种思路,如果只想过题,可直接跳转到方法二)自顶向下的动态规划,先写暴力递归过程,然后再直接加缓存表即可。 bool process(nums, index, next) nums:固定参数 index:当前来到的下标 next:能够走到的最远的
阅读全文
摘要:题目链接 解题思路 合并区间,肯定要按照第一维度排序。 然后依次处理每个区间。假设现在来到i区间[a, b],i之前的区间已经处理好,并且与i区间不重叠。i + 1的区间是[c, d],因为已经按照第一维度排序,所以能够得到a >= c,那么,b和c的关系如何? b < c:说明i区间与i+1区间不
阅读全文