- 博客(38)
- 收藏
- 关注
原创 Protocal buffer C++
2.如果某个消息体里的某个成员是个数组,应该怎么处理。1.protobuf中嵌套复合数据类型的序列化。3.在protobuf中使用枚举。
2024-09-02 17:18:26
251
原创 Java集合面试题(概述,list,Map)
一个常见的"fail-safe"集合例子是。这个集合在每次修改时都会复制当前的数组,修改操作在新数组上进行,而遍历操作则在旧数组上进行。这样,即使在遍历过程中进行了修改,也不会影响遍历的进行。
2024-06-02 14:59:09
391
原创 Java中的锁81-95
82.lock 和 AQS 的关系Lock:AQS (AbstractQueuedSynchronizer): 89. 为什么非公平锁比公平锁性能更好 内部类结构:非公平锁:公平锁:
2024-05-19 04:16:29
390
原创 Java并发编程线程池 68 - 80
68.什么是线程池?为什么要用线程池?是一个装有很多线程的池子,这些线程可以用来处理各种任务。当有任务需要执行时,线程池会提供一个线程来执行任务,任务完成后线程不会被销毁,而是回到池子里等待下一个任务。
2024-05-18 15:19:33
856
原创 Java并发理论39-67
volatile适用于标记状态变量,确保变量的可见性,不适用于需要保证原子性的操作。适用于需要确保可见性和原子性的场景,适合对方法或代码块进行同步控制,避免并发问题。61.什么是乐观锁,什么是悲观锁,有哪些实现方式Atomic 类是 Java 提供的一组用于在多线程环境下安全地操作单个变量的工具类。它们通过 CAS(Compare-And-Swap,比较并交换)操作来实现原子性,确保线程安全。
2024-05-18 14:38:05
845
原创 手撕多线程
有T1,T2,T3三个线程,怎么保证,T2 在T1后面执行,T3在T2 后面执行。计数累加怎么线程安全,可以怎么实现,100个线程,每个累加1000次。两个线程一个打abcd,一个打1234,交替打a1b2c3d4打10轮。线程A,B,C分别打印数字1,2,3顺序执行10次。两个线程交替打印A- Z,一个大写一个小写。500张票,44个窗口,模拟购票流程,用一个双线程轮流打印1-100。线程交叉打印12A34B56C。三个线程顺序打出1-100。打印a1b2...z26。
2024-05-08 19:16:36
297
原创 华为热题总结(1)
只要两个节点直接连接,且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意软件感染。这种恶意软件的传播将继续,直到没有更多的节点可以被这种方式感染。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。是在恶意软件停止传播之后,整个网络中感染恶意软件的最终节点数。,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。(水)组成的的二维网格,请你计算网格中岛屿的数量。,用以表示一个 IP 地址,返回所有可能的。此外,你可以假设该网格的四条边均被水包围。
2024-05-07 00:48:14
1311
原创 backTrack Mock
2.startIndex本身保证了组合的不同,需要求不同组合就要用startIndex;但从 i 开始还是从 i + 1 开始决定了组合元素能不能重复选。4.startIndex就是取了后面的不能取前面的所以保证不同的组合,但是排列不存在这个问题所以不用startIndex。3.组内既不能重复选,也不能有重复组合,数组中还有重复元素,就要sort(40)1.简而言之,一个集合里求组合就要用startIndex。6.子集是收集路径的组合。
2024-04-14 07:59:40
819
原创 ●day 18 第六章 二叉树 part05
它们的作用域只限于声明它们的代码块。:只有当当前叶子节点的深度超过之前记录的最大深度时,我们才更新存储的最左侧值。为此,我们需要有一个变量来跟踪当前节点的深度,并将其与已知的最大深度进行比较。这样,当我们遇到一个叶子节点时,我们可以检查它是否位于比我们之前见过的任何叶子节点更深的位置。这对于确定哪些节点位于最底层是必要的,因为我们的目标是找到最底层的最左侧节点的值。这样的变量,我们就无法确定每个节点的深度,从而无法确定哪个叶子节点位于最底层。它与方法内部的局部变量的可见性或类的成员变量的可见性无关。
2023-10-21 04:09:57
184
1
原创 ●day 17 第六章 二叉树part04
对于左节点不为空要判断一下。要么像第一个里面一样在第一个判断的时候加上判断左节点不为空。要么像第二个一样写在左节点不为空的判断里面。本章节就是三道leetcode题目的学习。给定一个二叉树,判断它是否是高度平衡的二叉树。的左右两个子树的高度差的绝对值不超过 1。,返回所有从根节点到叶子节点的路径。给你一个二叉树的根节点。是指没有子节点的节点。,返回所有左叶子之和。迭代法暂时先不掌握。
2023-10-10 08:24:52
170
1
原创 ●day 16 第六章 二叉树part03
的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。是指从根节点到最远叶子节点的最长路径上的节点数。给定一个二叉树,找出其最小深度。叶子节点是指没有子节点的节点。,求出该树的节点个数。
2023-10-07 01:20:10
166
1
原创 ●day 11 第五章 栈与队列part02
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。并不是真正的栈数据结构,而是一个可以动态修改的字符串。.size()记下来,因为后面有pop()操作,size会改变。在完成所有重复项删除操作后返回最终的字符串。1.字符串的比较中,字符串是双引号,字符是单引号。会选择两个相邻且相同的字母,并删除它们。初始值为-1,表示栈是空的。
2023-10-02 15:12:18
155
1
原创 day 10 第五章 栈与队列part01
当题目明确要求使用栈来实现,并特别提到“用栈实现队列”时,你应该确实使用一个栈的概念和接口。都是用来向数据结构中添加和移除元素的,但它们的操作语义基于不同的数据结构原则:队列基于 FIFO 原则,而栈基于 LIFO 原则。都可以用来模拟栈或队列,但具体使用哪个方法确实取决于你要模拟的数据结构(栈或队列),以及要满足的具体需求或题目要求。但从数据结构的特性和操作的语义上来看,它们是有区别的。接口,因此它们都提供了这些双端队列(双端队列)的操作。都是与集合中的元素互动的方法,尤其是在栈和队列的上下文中。
2023-10-01 18:45:14
204
原创 Day8-第四章 字符串part01
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须、使用 O(1) 的额外空间解决这一问题。对于这道题,代码随想录提示了反转链表:大家应该还记得,我们已经讲过了。在反转链表中,使用了双指针的方法。那么反转字符串依然是使用双指针的方法,只不过对于字符串的反转,其实要比链表简单一些。因为字符串也是一种数组,所以元素在内存中是连续分布,这就决定了反转链表和反转字符串方式上还是有所差异的。
2023-10-01 04:31:42
69
原创 ● Day7-第三章 哈希表part02
上一章遗留的两数之和和这一章的三数之和四数之和四数相加一起看。首先从代码随想录的一道思考题开始思考题既然三数之和可以使用双指针法,我们之前讲过的,可不可以使用双指针法呢?如果不能,题意如何更改就可以使用双指针法呢?两数之和 就不能使用双指针法,因为要求返回的是索引下标, 而双指针法一定要排序,一旦排序之后原数组的索引就被改变了。如果要求返回的是数值的话,就可以使用双指针法了。首先,什么时候适合用双指针来解决问题?
2023-09-19 16:44:36
214
原创 Day6-第三章 哈希表part01
哈希表理论基础 242 349 202 1首先一些理论基础(一些来自代码随想录)总结一下,。但是哈希法也是,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!Set是 Java 中的一个接口,不是类。它是 Java Collections Framework(JCF)的一部分,代表一个不包含重复元素的集合。由于Set是一个接口,它有多种实现,包括但不限于HashSet, 和TreeSet。
2023-09-18 08:08:16
93
1
原创 Day2-第一章数组part2-滑动窗口与螺旋矩阵
根据题目的要求,你需要生成一个从1到�×�n×n的螺旋矩阵,而不是从0开始。,因为我们已经访问了这一行。)时,我们知道所有的行都已被访问过,并且没有更多的行可以从上到下遍历,所以我们此时要终止遍历。的输入非常有用,这样的输入表示一个二维数组,但其中的每一行都是空的。像这句话,如果有重复的键,那么键就不会放进去,只会改掉之前的值对吗。
2023-09-16 07:29:40
181
1
原创 Day1-2数组
所以添加零的时候因为是从下一个要填充的位置开始添加,所以是 int i = left.小于n就是和前面一样。:在处理数组时,我们经常需要根据数组中的实际值来决定下一步的操作。这导致了总的 �(2�)O(2n) 复杂度,这仍然是线性的 �(�)O(n)。中间关于left,right符号的判断,要想需不需要等于的时候的值,显然是需要的。对于数组长度为1的情况,你给出的代码确实可以正常运行。初始值为1,所以返回值为1,表示新的数组长度为1,这是正确的。指向的是新数组的下一个空位置,而不是最后一个元素的位置。
2023-09-14 16:59:56
110
1
原创 Day16-第六章 二叉树 part02-层序遍历,反转二叉树,对称二叉树
1.与前中后序遍历不同的是,因为层序遍历要把一层的节点全给处理掉再进行下一层,所以需要两个循环来保证一层的节点都被处理了。简单地说,不同的遍历方法对应着不同的遍历需求,而每种数据结构(队列和栈)提供了满足这些需求的特定功能。对于DFS,你需要能够回到最近访问的节点并探索它的其他路径,所以使用后进先出的栈是合适的。对于BFS,你需要按照你访问它们的顺序访问节点,所以使用先进先出的队列是合适的。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。, 以数组的形式返回每一层节点的平均值。
2023-09-07 18:45:21
155
1
原创 Day14 第六章 二叉树part01-二叉树(递归遍历,迭代遍历,统一迭代)
第一次经过一个节点时,不能直接弹出它本身,因为中序遍历要先弹出它的左节点,这时候就应该先弹出然后在压入右节点之后再将其本身再次压入,然后压入左节点,第二次经过的时候再彻底弹出。写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。4.总体思路是,首先押入根节点,然后弹出一个节点就押入它的右左节点,这样每次先弹出自己,然后弹出左,左节点弹出完了,栈不为空然后依次弹出右节点。
2023-09-06 09:37:21
226
1
原创 MySQL
DML (data manipulation language),对表中的数据记录增删改。DQL (data query language)数据查询语言。varchar 和char 的区别,见面试题。多表查询内连接--39 8分10秒。员工工号:字符串,不超过10位;员工姓名:字符串,不超过10位;DDL-表操作-创建&查询。DDL-表操作-创建。DDL-表操作-修改。1.DQL-基础查询。1.DQL-基本查询。2.DQL-条件查询。4.DQL-条件查询。
2023-07-16 03:26:47
85
1
原创 Day3 Linked List
在一个递归过程中,函数直接或间接地调用自身,这样可以将复杂问题分解为更小、更易处理的子问题。链表可以被定义为一个节点(头节点),后面跟着一个较小的链表(剩余部分)。在链表中,每一个节点都有一个指向下一个节点的指针,这意味着链表的剩余部分本身也是一个链表。基本情况(Base Case):这是递归结束的情况,通常是问题规模最小时的解决方案。递归情况(Recursive Case):在递归情况中,问题被分解为更小的子问题。以上是递归求阶乘步骤的伪代码。在做链表的题时,先学习一下链表的递归遍历和递归。
2023-07-09 16:02:40
126
1
原创 Day1 二分查找
因为Leftmost和Rightmost其实就是在nums[m]与target相等的时候选择j-1和i+1的区别,所以引入一个boolean类型的参数即可,原题需要在找不到时返回[-1,-1].所以不考虑插入点(lc35)而是回归Leftmost和Rightmost。对于Leftmost那么我们返回一个比较有用的值这个值就是i,返回的i就是最后m所在的位置,或target应该插入的位置。2.为什么是m+1和m-1因为i和j会参与在查找中,而m这个点已经找过了。)回到主题,并合并最后的else。
2023-06-28 23:00:25
431
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人