力扣338.赎金信
338.赎金信
力扣题目链接
给你两个字符串:ransomNote 和 magazine,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
12输入:ransomNote = "a", magazine = "b"输出:false
示例 2:
12输入:ransomNote = "aa", magazine = "ab"输出:false
示例 3:
12输入:ransomNote = "aa", magazine = "aab"输出:true
提示:
1 <= ransomNote.length, magazine.length <= 105 ransomNote 和 magazine 由小写英文字母组成
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/ransom-note
思路
统计magazine中的字母次数,再用ransomNote中的字 ...
力扣19.删除链表的倒数第N个节点
19.删除链表的倒数第N个节点
力扣题目链接
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
12输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]
示例 2:
12输入:head = [1], n = 1输出:[]
示例 3:
12输入:head = [1,2], n = 1输出:[1]
提示:
链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list
思路
可以通过遍历计算链表长度得到然后第二次找到进行删除,也可以通过双指针的方法使快指针领先慢指针,当快指针位于链表尾部时慢指针即处于要删除的节点,还可以通过栈(先进后出)来取得倒数个节点。这里提供一种递归的方法,类似于栈进行处理。
当处于尾节点时,返回1,判断当处于时返回节点(需要删除 ...
力扣24.两两交换链表中的节点
24.两两交换链表中的节点
力扣题目链接
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例1:
12输入:head = [1,2,3,4]输出:[2,1,4,3]
示例 2:
12输入:head = []输出:[]
示例 3:
12输入:head = [1]输出:[1]
提示:
链表中节点的数目在范围 [0, 100]内 0 <= Node.val <= 100
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/swap-nodes-in-pairs
思路
保存要交换的上一个节点(第一个),当前节点(第二个)以及下一个节点,下一个是否为空作为判断条件,进行两个节点交换,并判断是否处于头节点,根据奇数和偶数节点的不同采用不同的方式在对next节点进行赋值。
实现代码
123456789101112131415161718192021222324252627282930313233343536373839 ...
力扣707.设计链表
707.设计链表
力扣题目链接
你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。
如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。
实现 MyLinkedList 类:
MyLinkedList()初始化MyLinkedList对象。 int get(int index) 获取链表中下标为index的节点的值。如果下标无效,则返回 -1 。 void addAtHead(int val) 将一个值为val的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。 void addAtTail(int val)将一个值为val的节点追加到链表中作为链表的最后一个元素。 void addAtIndex(int index, int val)将一个值为 val的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点 ...
力扣59.螺旋矩阵II
59.螺旋矩阵II
力扣题目链接
给你一个正整数 ,生成一个包含 到 所有元素,且元素按顺时针顺序螺旋排列的 正方形矩阵 。
示例 1:
12输入:n = 3输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
12输入:n = 1输出:[[1]]
提示:
1 <= n <= 20
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/spiral-matrix-ii
思路
模拟矩阵的生成。需要特别注意循环不变原则。
(1)从左到右填充最上层(闭区间)
(2)从上到下填充最右层(跳到下一个目标位置的闭区间)
(3)从右到左填充最下层(跳到下一个目标位置的闭区间)
(4)从下到上填充最左层(跳到下一个目标位置的闭区间)
在纸上很容易画出该过程。每个颜色为一次填充。
实现代码:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495 ...
《代码随想录》笔记1——编程素养
本文是我在学习(程序员Carl (opens new window))的原创作品《代码随想录》做的笔记。现上传到我的博客,大家可以去看看大佬的作品,真的很不错。
1.需求文档
我们要根据需求文档来确定我们究竟要做什么,而且每个阶段的需求文档相当于是把这个项目的整个迭代过程都记录下来了。
2.包含的功能
3.难点
记录难点并进行量化。记录下如何克服困难。
4.架构图
画架构图的过程中,也增添自己对整个系统架构的掌握程度,展示每个模块和每一个模块之间的依赖关系。
5.定协议
后台模块之间进行通讯需要协议,后台和前端通讯也需要协议。所以只要有交互,就要确定协议的数据格式。
定协议要考虑到兼容,要考虑易于维护。
6.设计数据结构和算法
7.预估一下容量
估计出 我们自己模块大体需要多大磁盘,多大内存,多大带宽,多少核CPU。
8.考虑部署
要考虑如果一台机器挂了(可能是硬件原因),那么我们的模块还能不能正常提供服务。这就是考虑模块的容灾性,一般都是采用分布式,服务部署在三台机器上,一台如果挂了,还有其他两台提供服务。还有就是要弹性可伸缩,即我们的模块可不可以直接 部 ...
《代码随想录》笔记2——算法性能分析
本文是我在学习(程序员Carl (opens new window))的原创作品《代码随想录》做的笔记。现上传到我的博客,大家可以去看看大佬的作品,真的很不错。
算法性能分析
时间复杂度
时间复杂度
(1)时间复杂度
一个函数,定性描述一个算法的运行时间。
假设算法的问题规模为n,那么操作单元数量便用函数来表示,随着数据规模的增大,算法执行时间的增长率和的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 。
(2)大O
函数的渐近上界。
输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是O(n),但如果数据是逆序的话,插入排序的时间复杂度就是,也就对于所有输入情况来说,最坏是的时间复杂度,所以称插入排序的时间复杂度为。快速排序是,但是当数据已经有序情况下,快速排序的时间复杂度是的,所以严格从大O的定义来讲,快速排序的时间复杂度应该是。但是我们依然说快速排序是的时间复杂度,这个就是业内的一个默认规定,这里说的代表的就是一般情况,而不是严格的上界。
(3)不同数据规模下不同时间复杂度的时间
从上图可以只看出再决定使用什么算法时 ...
群晖配置git仓库简单教程
群晖配置git仓库:
1.打开ssh服务:
访问群晖桌面系统--->控制面板--->终端机和SNMP--->开启ssh功能。
2.下载git:
在群晖桌面系统中打开套件中心,下载Git Sever,配置用户权限。
3.用cmd或者xshell等远程ssh工具连接服务器(后面都假定用户名root,实际使用一般不用root用户):
ssh root@IP -p 22
4.建立git仓库(此步骤之后创建新项目直接从此步执行,为了安全,建议新建一个用户用于管理仓库):
进入/volume1/test(其他路径或储存池也可以),创建相应项目文件夹。如:
cd /volume1/test
mkdir manual.git
cd manual.git
创建裸库:
git init --bare
回到本地系统中创建文件夹并克隆远程库:
git clone root@ip:/volume1/test/manual.git
放入相应文件项目即可提交。
配置静态局域网ip:
本步骤当路由器重置或者ip频繁自动变化时需要执行。
打开路由器管理页面,局域网设置---&g ...