栈和队列篇总结
20 有效括号题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
12输入:s = "()"输出:true
示例 2:
12输入:s = "()[]{}"输出:true
示例 3:
12输入:s = "(]"输出:false
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
思路因为题目中给出了s中的括号由(){}[]三者组成。遍历字符串, 如果遇到( 就将) 添加进入栈, 如果遇到[ 就将]添加进入栈, {也是相同的方式。
为什么用这种方式呢, 因为题目中说了
...
力扣每日一刷(2023.10.2)
203 移除链表元素题目:
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
12输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]
示例 2:
12输入:head = [], val = 1输出:[]
示例 3:
12输入:head = [7,7,7,7], val = 7输出:[]
提示:
列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50
思路:题目要求: 删除链表中所有满足 Node.val == val的节点 。
首先需要删除前缀节点中含有val相等的节点
接下来就是删除中间和后面含有val相等的节点。
前缀中含有的我们可以直接通过移动头节点到下一个节点即可。
中间的就需要断开要删除的节点的连接, 使其连接到要删除节点的下一位上。 就是node.next = node.next.next
至于末尾的如果有要删除的节点 ...
Java内存区域
概述
本篇文章是根据学习《深入理解Java虚拟机》书籍及其聆听尚硅谷宋红康老师讲解 ,最终自己按照自己的理解总结而出
图片引用: https://imlql.cn/post/a7ad3cab.html && 尚硅谷教育
对于c++选手来说, 内存管理是一项基本功,因为c++没有自带的管理技术, 所以c++开发人员需要自己对实现的所有代码进行内存管理。 虽然说Java实现了一套自己的内存管理机制, 这让Java程序员可以全心投入到需求开发中去, 不需要对内存做太多了的了解。 但是问题也正是出现在这里, 因为不知道虚拟机是怎么使用内存的,所以出了问题也是无从下手,不知道具体哪里出了问题。 所以这些都是我们Java程序员需要了解和掌握的内存管理技术的原因。
之前我们学习了类加载器子系统的知识 ,知道了一个Class文件是如何一步步被加载到虚拟机内存中的开始 ,到卸载出内存位为止, 他的整个生命周期以及每个周期所做的事等等….
既然一个类已经被加载到内存了 ,那么下一步就是查看内存如何管理这些了
运行时数据区(Runtime Data Area)
当我们通过前面 ...
力扣每日一刷(2023.9.24)
739 每日温度题目:
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
12输入: temperatures = [73,74,75,71,69,72,76,73]输出: [1,1,4,2,1,1,0,0]
示例 2:
12输入: temperatures = [30,40,50,60]输出: [1,1,1,0]
示例 3:
12输入: temperatures = [30,60,90]输出: [1,1,0]
提示:
1 <= temperatures.length <= 105
30 <= temperatures[i] <= 100
思路本题其实可以使用暴力解法实现的, 但是力扣的时间复杂度分析的有问题, O(n2)的时间复杂度尽然过不了。
所以只能寻求更简洁的方法, 那就是通过空间换取时间(单调栈思路)
使用单调栈, 如果出现单调递减的情况, 那么就直接入栈, ...
力扣每日一刷(2023.9.21)
392 判断子序列题目:
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,”ace”是”abcde”的一个子序列,而”aec”不是)。
进阶:
如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
示例 1:
输入:s = “abc”, t = “ahbgdc” 输出:true
示例 2:
输入:s = “axc”, t = “ahbgdc” 输出:false
提示:
0 <= s.length <= 100
0 <= t.length <= 10^4
两个字符串都只由小写字符组成。
思路本题其实不使用动态规划的思路也是能够解出来的 ,并且时间复杂度 和 空间复杂度更低。 因为题目中问的是 s 是否为t 的自序列, 我们自需要顺序遍历 t , ...
力扣每日一刷(2023.9.19)
300 最长递增子序列题目:
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
示例 1:
123输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例 2:
12输入:nums = [0,1,0,3,2,3]输出:4
示例 3:
12输入:nums = [7,7,7,7,7,7,7]输出:1
提示:
1 <= nums.length <= 2500
-104 <= nums[i] <= 104
进阶:
你能将算法的时间复杂度降低到 O(n log(n)) 吗?
思路:本题刚开始其实我是按照双指针做的, 当时看到这道题想都没想 直接通过滑动窗口的方式确定最大的递增子序列。 结果看来用例才发现他找的是子序列, 不是连续子序列……
所以滑动窗口的方式基本是不适用这道题的(就算适用我也没想出 ...
力扣每日一刷(2023.9.14)
377 组合总和Ⅱ题目
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
示例 1:
123456789101112输入:nums = [1,2,3], target = 4输出:7解释:所有可能的组合为:(1, 1, 1, 1)(1, 1, 2)(1, 2, 1)(1, 3)(2, 1, 1)(2, 2)(3, 1)请注意,顺序不同的序列被视作不同的组合。
示例 2:
12输入:nums = [9], target = 3输出:0
提示:
1 <= nums.length <= 200
1 <= nums[i] <= 1000
nums 中的所有元素 互不相同
1 <= target <= 1000
进阶:如果给定的数组中含有负数会发生什么?问题会产生何种变化?如果允许负数出现,需要向题目中添加哪些限制条件?
思路题目中说到:从 nums 中找出并返回总和为 target 的元素组合的个数。 但是后 ...
力扣每日一刷(2023.9.12)
416 分割等和子集题目:
题目难易:中等
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200
示例 1:
输入: [1, 5, 11, 5]
输出: true
解释: 数组可以分割成 [1, 5, 5] 和 [11].
示例 2:
输入: [1, 2, 3, 5]
输出: false
解释: 数组不能分割成两个元素和相等的子集.
提示:
1 <= nums.length <= 200
1 <= nums[i] <= 100
思路:题目中要求 :使得两个子集的元素和相等。 那么就可以对数组中的所有元素求和, 如果sum%2 != 0 ,那么就直接返回false 。原因这里就不多了, 奇数怎么可能有两个相等的子集和呢?
如此一来就可以将本体转换为求数组中的元素之和能否等于 sum/2了。 这样就可以用到动态规划的思路来进行解题了。
dp[i] 表示 背包容量为 i 的背包, 所能容纳的物体的最大价 ...
力扣每日一刷(2023.9.11)
63题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
示例 1:
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2 解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
向右 -> 向右 -> 向下 -> 向下
向下 -> 向下 -> 向右 -> 向右
示例 2:
输入:obstacleGrid = [[0,1],[0,0]]
输出:1
提示:
m == obstacleGrid.length
n == obstacleGrid[i].length
1 <= m, n <= 100
思路本题其 ...
网络通信协议整体框架
通信协议综述协议三要素
语法
就是这一段内容要符合一定的规则和格式。例如,括号要成对,结束要使用分号等。
语义
就是这一段内容要代表某种意义。例如数字减去数字是有意义的,数字减去文本一般来说就没有意义。
顺序
就是先干啥,后干啥。例如,可以先加上某个数值,然后再减去某个数值。
通过编程语言我们可以学会了如何使用计算机及其让计算机完成特定的任务。 但这只是一台计算机的作用, 如果想要使用很多计算机 ,那么就需要借助网络, 而通过网络协议,才能使很多机器互相协作、共同完成一件事。
各个协议详情(自顶向下)
应用层
传输层
网络层
链路层
程序如何工作以用户访问某个页面点击操作为例
简单想想一下”你“这个程序是如何工作的。
用户点击某个链接, 就会有一个网络包发送至服务器端, 当一个网络包从一个网口经过的时候,你看到了,首先先看看要不要请进来,处理一把。有的网口配置了混杂模式,凡是经过的,全部拿进来。
拿进来以后,就要交给一段程序来处理。于是,你调用 一个函数process_layer2(buffer)。当然,这是一个假的函数。但是你明白其中的意思,知道肯定是有这么个函数的。 ...