《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_2

《剑指Offer》笔记&题解&思路&技巧&优化_Part_2

  • 😍😍😍 相知
  • 🙌🙌🙌 相识
  • 🍓🍓🍓广度优先搜索BFS
  • 🍓🍓🍓深度优先搜索DFS
  • 😢😢😢 开始刷题
    • 1. LCR 129. 字母迷宫——矩阵中的路径
    • 2. LCR 130. 衣橱整理——机器人的运动范围
    • 3. LCR 131. 砍竹子 I——剪绳子I
    • 4. LCR 132. 砍竹子 II——剪绳子II
    • 5. LCR 133. 位 1 的个数——二进制中1的个数
    • 6. LCR 134. Pow(x, n)——数值的整数次方
    • 7. LCR 135. 报数——打印从1到最大的n位数
    • 8. LCR 136. 删除链表的节点——删除链表的节点
    • 9. LCR 137. 模糊搜索验证——正则表达式匹配

在这里插入图片描述

😍😍😍 相知

当你踏入计算机科学的大门,或许会感到一片新奇而陌生的领域,尤其是对于那些非科班出身的学子而言。作为一位非科班研二学生,我深知学习的道路可能会充满挑战,让我们愿意迎接这段充满可能性的旅程。

最近,我开始了学习《剑指Offer》和Java编程的探索之旅。这不仅是一次对计算机科学的深入了解,更是对自己学术生涯的一次扩展。或许,这一切刚刚开始,但我深信,通过努力与坚持,我能够逐渐驾驭这门技艺。

在这个博客中,我将深入剖析《剑指Offer》中的问题,并结合Java编程语言进行解析。

让我们一起踏上这段学习之旅,共同奋斗,共同成长。无论你是已经驾轻就熟的Java高手,还是像我一样初出茅庐的学子,我们都能在这里找到彼此的支持与激励。让我们携手前行,共同迎接知识的挑战,为自己的未来打下坚实的基石。

这是我上一篇博客的,也希望大家多多关注!

  1. 《剑指Offer》笔记&题解&思路&技巧&优化 Java版本——新版leetcode_Part_1

🙌🙌🙌 相识

根据题型可将其分为这样几种类型:

  1. 结构概念类(数组,链表,栈,堆,队列,树)
  2. 搜索遍历类(深度优先搜索,广度优先搜索,二分遍历)
  3. 双指针定位类(快慢指针,指针碰撞,滑动窗口)
  4. 排序类(快速排序,归并排序)
  5. 数学推理类(动态规划,数学)

🍓🍓🍓广度优先搜索BFS

  1. 选定一个结点访问
  2. 访问完后入队
  3. 依次访问已选结点相关联的其他结点并入队
  4. 依次访问队中其他结点,访问完所有相关联结点后出队
  5. 所有结点访问完成

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
树——谁出来,放谁的子节点进去!


对于图来说!

在这里插入图片描述
图没有根节点,我们从任意一个节点出发!

在这里插入图片描述

🍓🍓🍓深度优先搜索DFS

在这里插入图片描述
利用栈

😢😢😢 开始刷题

1. LCR 129. 字母迷宫——矩阵中的路径

题目跳转:https://leetcode.cn/problems/ju-zhen-zhong-de-lu-jing-lcof/description/
在这里插入图片描述

class Solution {public boolean wordPuzzle(char[][] grid, String target) {if(grid.length*grid[0].length< target.length())return false;boolean[][] visited = new boolean[grid.length][grid[0].length];for(int i = 0;i<grid.length;i++){for(int j =0;j<grid[i].length;j++){if(dfs(grid,i,j,target,0)) return true;}}return false;}public boolean dfs(char[][] grid,int i,int j,String target,int k){if(i<0||i>=grid.length||j<0||j>=grid[i].length||grid[i][j] != target.charAt(k)){return false;}if(k == target.length()-1)return true;grid[i][j] = '1';boolean res = dfs(grid,i,j+1,target,k+1)||dfs(grid,i+1,j,target,k+1)||dfs(grid,i,j-1,target,k+1)||dfs(grid,i-1,j,target,k+1);grid[i][j] = target.charAt(k);return res;}
}

2. LCR 130. 衣橱整理——机器人的运动范围

题目跳转:https://leetcode.cn/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/description/

补充说明如下:

digit(x),表示数字 x 的个十百千…位数字之和,比如 digit(726) = 7 + 2 + 6 = 15
允许向下或向右移动一格,不允许跨过格子,如果向下向右的格子均不可整理,则不能继续向下向右移动,返回 [0][0] 坐标;
一次移动到尽头后,可以返回 [0][0] 位置,沿着一条新路径开始整理;

  • 举例1:
    一个 4 x 7 的矩阵,cnt 为 5,
    则可整理的格子如下,y 表示可整理,n 表示不可整理:
\、0123456
0yyyyyyn
1yyyyynn
2yyyynnn
3yyynnnn

digit(0) + digit(6) = 0 + 6 = 6 > cnt (cnt为5),所以不可整理,以此类推。
所以可整理格子数量总计为 18 格。

  • 举例2:
    一个 4 x 11 的矩阵,cnt 为 2,
    则可整理的格子如下,y 表示可整理,n 表示不可整理:
|012345678910
0yyynnnnnnnn
1yynnnnnnnnn
2ynnnnnnnnnn
3nnnnnnnnnnn

digit(0) + digit(10) = 0 + 1+0 = 1 < cnt (cnt为2),虽然满足digit要求,但没有可达的路径,
一次只能向下、向右移动一格,不能跨格子,所以[0][10]也不可整理。
所以可整理格子数量总计为 6 格。

class Solution {public int wardrobeFinishing(int m, int n, int cnt) {boolean[][] visited = new boolean[m][n];return dfs(0, 0, m, n, cnt, visited);}int dfs(int i, int j, int m, int n, int k, boolean visited[][]) {if (i < 0 || i >= m || j < 0 || j >= n || (i/10 + i%10 + j/10 + j%10) > k || visited[i][j]) {return 0;}visited[i][j] = true;return dfs(i + 1, j, m, n, k, visited) + dfs(i - 1, j, m, n, k, visited) + dfs(i, j + 1, m, n, k, visited) + dfs(i, j - 1, m, n, k, visited) + 1;}
}

3. LCR 131. 砍竹子 I——剪绳子I

题目跳转:https://leetcode.cn/problems/jian-sheng-zi-lcof/description/

在这里插入图片描述

class Solution {public int cuttingBamboo(int bamboo_len) {// n<=3的情况,m>1必须要分段,例如:3必须分成1、2;1、1、1 ,n=3最大分段乘积是2, 同理2的最大乘积为1if (bamboo_len==1 ||  bamboo_len== 2)return 1;if (bamboo_len == 3)return 2;int sum = 1;while(bamboo_len>4){sum *=3;bamboo_len -=3;}return sum*bamboo_len;}
}

在这里插入图片描述

class Solution {public int cuttingRope(int bamboo_len) {int[] dp = new int[bamboo_len + 1];for (int i = 2; i <= bamboo_len; i++) {int curMax = 0;for (int j = 1; j < i; j++) {curMax = Math.max(curMax, Math.max(j * (i - j), j * dp[i - j]));}dp[i] = curMax;}return dp[bamboo_len];}
}

4. LCR 132. 砍竹子 II——剪绳子II

题目跳转:https://leetcode.cn/problems/jian-sheng-zi-ii-lcof/description/

贪心算法

class Solution {public int cuttingBamboo(int bamboo_len) {if (bamboo_len==1 ||  bamboo_len== 2)return 1;if (bamboo_len == 3)return 2;long res = 1;while(bamboo_len>4){res *=3;res = res%1000000007;bamboo_len -=3;}return (int)(res*bamboo_len%1000000007);}
}

动态规划+大数

import java.math.BigInteger;class Solution {public int cuttingRope(int n) {BigInteger dp[] = new BigInteger[n + 1];Arrays.fill(dp, BigInteger.valueOf(1));for (int i = 3; i <= n; i++) {for (int j = 1; j < i; j++) {dp[i] = dp[i].max(BigInteger.valueOf(j * (i - j))).max(dp[i - j].multiply(BigInteger.valueOf(j)));}}return  dp[n].mod(BigInteger.valueOf(1000000007)).intValue();}
}

5. LCR 133. 位 1 的个数——二进制中1的个数

题目跳转:https://leetcode.cn/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/description/

学个小小函数

public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {return Integer.bitCount(n);}
}
public int hammingWeight(int n) {String s = Integer.toBinaryString(n);int count = 0;for (int i = 0; i < s.length(); i++){if (s.charAt(i) == '1')count++;}return count;
}

在这里插入图片描述

  • 异或运算的性质?
    • 运算规则:相同为0,不同为1
    • N^0= N
    • N^N=0
    • a^b=b^a
    • a^(b^C) = (a^b)^c

在这里插入图片描述

把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int count=0;while(n!=0){n=n&(n-1);count++;}return count;}
}

6. LCR 134. Pow(x, n)——数值的整数次方

题目跳转:https://leetcode.cn/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/description/

首先主打一个叛逆!但是你真这么写 别逼我删你 我们主要是熟悉函数!

class Solution {public double myPow(double x, int n) {return Math.pow(x,n);}
}
class Solution {public double myPow(double x, int n) {if(n==0)return 1;if(n==1)return x;if(n==-1)return 1/x;double half = myPow(x, n / 2);double mod = myPow(x, n % 2);return half * half * mod;}
}

7. LCR 135. 报数——打印从1到最大的n位数

题目跳转:https://leetcode.cn/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/description/

class Solution {public int[] countNumbers(int cnt) {int[] temp  = new int[(int)Math.pow(10,cnt)-1];for(int i = 0;i < temp.length;i++){temp[i] = i+1;}return temp;}
}

要是考虑大数!!

class Solution {StringBuilder res;int count = 0, cnt;char[] num, loop = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};public String countNumbers(int cnt) {this.cnt = cnt;res = new StringBuilder(); // 数字字符串集num = new char[cnt]; // 定义长度为 cnt 的字符列表dfs(0); // 开启全排列递归res.deleteCharAt(res.length() - 1); // 删除最后多余的逗号return res.toString(); // 转化为字符串并返回}void dfs(int x) {if(x == cnt) { // 终止条件:已固定完所有位res.append(String.valueOf(num) + ","); // 拼接 num 并添加至 res 尾部,使用逗号隔开return;}for(char i : loop) { // 遍历 ‘0‘ - ’9‘num[x] = i; // 固定第 x 位为 idfs(x + 1); // 开启固定第 x + 1 位}}
}

8. LCR 136. 删除链表的节点——删除链表的节点

题目跳转:https://leetcode.cn/problems/shan-chu-lian-biao-de-jie-dian-lcof/description/

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution {public ListNode deleteNode(ListNode head, int val) {if(head.val==val) return head.next;ListNode result = head;while(head.next!=null){if(head.next.val == val ){head.next = head.next.next;break;}head = head.next;}return result;}
}

9. LCR 137. 模糊搜索验证——正则表达式匹配

题目跳转:https://leetcode.cn/problems/zheng-ze-biao-da-shi-pi-pei-lcof/description/

题目中的模糊搜索验证是指一个「逐步匹配」的过程:我们每次从字符串 p p p 中取出一个字符或者「字符 + 星号」的组合,并在 s s s中进行匹配。对于 p p p 中一个字符而言,它只能在 s s s 中匹配一个字符,匹配的方法具有唯一性;而对于 p p p 中字符 + 星号的组合而言,它可以在 s s s中匹配任意自然数个字符,并不具有唯一性。因此我们可以考虑使用动态规划,对匹配的方案进行枚举。

我们用 f [ i ] [ j ] f[i][j] f[i][j] 表示 s s s 的前 i i i 个字符与 p p p 中的前 j j j 个字符是否能够匹配。在进行状态转移时,我们考虑 p p p 的第 j j j 个字符的匹配情况:

如果 p p p 的第 j j j 个字符是一个小写字母,那么我们必须在 s s s 中匹配一个相同的小写字母,即

f [ i ] [ j ] = { f [ i − 1 ] [ j − 1 ] s [ i ] = p [ j ] false  s [ i ] ≠ p [ j ] f[i][j]=\left\{ \begin{matrix} f[i-1][j-1] & s[i]=p[j] \\ \text{false } & s[i]\ne p[j] \\ \end{matrix} \right. f[i][j]={f[i1][j1]false s[i]=p[j]s[i]=p[j]

也就是说,如果 s s s 的第 i i i 个字符与 p p p 的第 j j j 个字符不相同,那么无法进行匹配;否则我们可以匹配两个字符串的最后一个字符,完整的匹配结果取决于两个字符串前面的部分。

如果 p p p 的第 j j j 个字符是 ∗ * ,那么就表示我们可以对 p p p 的第 j − 1 j-1 j1 个字符匹配任意自然数次。在匹配 0 0 0 次的情况下,我们有

f [ i ] [ j ] = f [ i ] [ j − 2 ] f[i][j]=f[i][j−2] f[i][j]=f[i][j2]

也就是我们「浪费」了一个字符 + 星号的组合,没有匹配任何 s s s 中的字符。

在匹配 1,2,3,⋯1,2,3, \cdots1,2,3,⋯ 次的情况下,类似地我们有

f [ i ] [ j ] = f [ i − 1 ] [ j − 2 ] , if  s [ i ] = p [ j − 1 ] f [ i ] [ j ] = f [ i − 2 ] [ j − 2 ] , if  s [ i − 1 ] = s [ i ] = p [ j − 1 ] f [ i ] [ j ] = f [ i − 3 ] [ j − 2 ] , if  s [ i − 2 ] = s [ i − 1 ] = s [ i ] = p [ j − 1 ] ⋯ ⋯ \begin{aligned} & f[i][j] = f[i - 1][j - 2], \quad && \text{if~} s[i] = p[j - 1] \\ & f[i][j] = f[i - 2][j - 2], \quad && \text{if~} s[i - 1] = s[i] = p[j - 1] \\ & f[i][j] = f[i - 3][j - 2], \quad && \text{if~} s[i - 2] = s[i - 1] = s[i] = p[j - 1] \\ & \cdots\cdots & \end{aligned} f[i][j]=f[i1][j2],f[i][j]=f[i2][j2],f[i][j]=f[i3][j2],⋯⋯if s[i]=p[j1]if s[i1]=s[i]=p[j1]if s[i2]=s[i1]=s[i]=p[j1]

如果我们通过这种方法进行转移,那么我们就需要枚举这个组合到底匹配了 s s s 中的几个字符,会增导致时间复杂度增加,并且代码编写起来十分麻烦。我们不妨换个角度考虑这个问题:字母 + 星号的组合在匹配的过程中,本质上只会有两种情况:

匹配 s s s 末尾的一个字符,将该字符扔掉,而该组合还可以继续进行匹配;

不匹配字符,将该组合扔掉,不再进行匹配。

如果按照这个角度进行思考,我们可以写出很精巧的状态转移方程:

f [ i ] [ j ] = { f [ i − 1 ] [ j ] or  f [ i ] [ j − 2 ] , s [ i ] = p [ j − 1 ] f [ i ] [ j − 2 ] , s [ i ] ≠ p [ j − 1 ] f[i][j] = \begin{cases} f[i - 1][j] \text{~or~} f[i][j - 2], & s[i] = p[j - 1] \\ f[i][j - 2], & s[i] \neq p[j - 1] \end{cases} f[i][j]={f[i1][j] or f[i][j2],f[i][j2],s[i]=p[j1]s[i]=p[j1]

在任意情况下,只要 p [ j ] p[j] p[j] . . .,那么 p [ j ] p[j] p[j] 一定成功匹配 s s s中的任意一个小写字母。

最终的状态转移方程如下:

f [ i ] [ j ] = { if  ( p [ j ] ≠ ‘*’ ) = { f [ i − 1 ] [ j − 1 ] , matches ( s [ i ] , p [ j ] ) false , otherwise otherwise = { f [ i − 1 ] [ j ] or  f [ i ] [ j − 2 ] , matches ( s [ i ] , p [ j − 1 ] ) f [ i ] [ j − 2 ] , otherwise f[i][j] = \begin{cases} \text{if~} (p[j] \neq \text{~`*'}) = \begin{cases} f[i - 1][j - 1], & \textit{matches}(s[i], p[j])\\ \text{false}, & \text{otherwise} \end{cases} \\ \text{otherwise} = \begin{cases} f[i - 1][j] \text{~or~} f[i][j - 2], & \textit{matches}(s[i], p[j-1]) \\ f[i][j - 2], & \text{otherwise} \end{cases} \end{cases} f[i][j]= if (p[j]= ‘*’)={f[i1][j1],false,matches(s[i],p[j])otherwiseotherwise={f[i1][j] or f[i][j2],f[i][j2],matches(s[i],p[j1])otherwise

其中 matches ( x , y ) \textit{matches}(x, y) matches(x,y) 判断两个字符是否匹配的辅助函数。只有当 y y y . . . 或者 x x x y y y 本身相同时,这两个字符才会匹配。

细节

动态规划的边界条件为 f [ 0 ] [ 0 ] = true f[0][0] = \text{true} f[0][0]=true,即两个空字符串是可以匹配的。最终的答案即为 f [ m ] [ n ] f[m][n] f[m][n],其中 m m m n n n 分别是字符串 s s s p p p 的长度。由于大部分语言中,字符串的字符下标是从 0 0 0 开始的,因此在实现上面的状态转移方程时,需要注意状态中每一维下标与实际字符下标的对应关系。

在上面的状态转移方程中,如果字符串 p p p 中包含一个「字符 + 星号」的组合(例如 a ∗ a* a),那么在进行状态转移时,会先将 a a a 进行匹配(当 p [ j ] p[j] p[j] a a a 时),再将 a ∗ a* a 作为整体进行匹配(当 ] p [ j ] ]p[j] ]p[j] ∗ * 时)。然而,在题目描述中,我们必须将 a ∗ a* a 看成一个整体,因此将 a a a 进行匹配是不符合题目要求的。看来我们进行了额外的状态转移,这样会对最终的答案产生影响吗?这个问题留给读者进行思考。

class Solution {public boolean isMatch(String s, String p) {int m = s.length();int n = p.length();boolean[][] f = new boolean[m + 1][n + 1];f[0][0] = true;for (int i = 0; i <= m; ++i) {for (int j = 1; j <= n; ++j) {if (p.charAt(j - 1) == '*') {f[i][j] = f[i][j - 2];if (matches(s, p, i, j - 1)) {f[i][j] = f[i][j] || f[i - 1][j];}} else {if (matches(s, p, i, j)) {f[i][j] = f[i - 1][j - 1];}}}}return f[m][n];}public boolean matches(String s, String p, int i, int j) {if (i == 0) {return false;}if (p.charAt(j - 1) == '.') {return true;}return s.charAt(i - 1) == p.charAt(j - 1);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES监控方法以及核心指标

文章目录 1. 监控指标采集1.1 部署elasticsearch_exporter1.2 prometheus采集elasticsearch_exporter的暴露指标1.3 promethues配置告警规则或者配置grafana大盘 2. 核心告警指标2.1 es核心指标2.2 es容量模型建议 3. 参考文章 探讨es的监控数据采集方式以及需要关注的核心指标…

Qt 常用算法及正则表达式

目录 常用算法 正则表达式 常用算法 double c qAbs(a)&#xff0c;函数 qAbs() 返回 double 型数值 a 的绝对值 double max qMax(b,c)&#xff0c;函数 qMax() 返回两个数值中的最大值 int bnqRound(b)&#xff0c;返回一个与浮点数最接近的整数值(四舍五入) int cn q…

【八大排序】归并排序 | 计数排序 + 图文详解!!

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C语言进阶之路 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 一、归并排序1.1 基本思想 动图演示2.2 递归版本代码实现 算法步骤2.3 非递归版本代…

面试经典150题——长度最小的子数组

​"In the midst of winter, I found there was, within me, an invincible summer." - Albert Camus 1. 题目描述 2. 题目分析与解析 首先理解题意&#xff0c;题目要求我们找到一个长度最小的 连续子数组 满足他们的和大于target&#xff0c;需要返回的是子数组的…

探索现代Web前端开发框架:选择最适合你的工具

在当今快速发展的Web开发领域&#xff0c;前端开发框架的选择显得尤为关键。这些框架可以帮助我们更高效地构建出交互性强、性能卓越的用户界面。本文将带你了解几个当前最受欢迎的Web前端开发框架&#xff0c;并帮助你根据自己的需求选择最合适的工具。 1. React React由Fac…

K8S之运用节点选择器指定Pod运行的节点

node节点选择器的使用 使用场景实践使用nodeName使用nodeSelectornodeName和nodeSelector混合使用1、设置了nodeName 和 设置 Node上都不存在的标签。看调度情况2、设置nodeName 为node1 和 设置 node2上才有的标签。看调度情况 实践总结 使用场景 默认情况&#xff0c;在创建…

故障诊断 | 一文解决,TCN时间卷积神经网络模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,TCN时间卷积神经网络模型的故障诊断(Matlab) 模型描述 时间卷积神经网络(TCN)是一种用于序列数据建模和预测的深度学习模型。它通过卷积操作在时间维度上对序列数据进行特征提取,并且可以处理可变长度的输入序列。 要使用TCN进行…

vue-组件组成和组件通信(四)

组件的三大组成部分 (结构/样式/逻辑) scoped样式冲突 默认情况&#xff1a;写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。 1. 全局样式: 默认组件中的样式会作用到全局 2. 局部样式: 可以给组件加上 scoped 属性, 可以让样式只作用于当前组…

nginx添加lua模块

目录 已安装了nginx&#xff0c;后追加lua模块nginx 重新编译知识参考&#xff1a; 从零安装一、首先需要安装必要的库&#xff08;pcre、zlib、openssl&#xff09;二、安装LUA环境及相关库 &#xff08;LuaJIT、ngx_devel_kit、lua-nginx-module&#xff09;注意&#xff1a;…

基于YOLOv8的暗光低光环境下(ExDark数据集)检测,加入多种优化方式---DCNv4结合SPPF ,助力自动驾驶(一)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了暗光低光数据集检测整个过程&#xff0c;从数据集到训练模型到结果可视化分析&#xff0c;以及如何优化提升检测性能。 &#x1f4a1;&#x1f4a1;&#x1f4a1;加入 DCNv4结合SPPF mAP0.5由原始的0.682提升至…

牛客网SQL进阶114:更新记录

官网链接&#xff1a; 更新记录&#xff08;二&#xff09;_牛客题霸_牛客网现有一张试卷作答记录表exam_record&#xff0c;其中包含多年来的用户作答试卷记录&#xff0c;结构如下表。题目来自【牛客题霸】https://www.nowcoder.com/practice/0c2e81c6b62e4a0f848fa7693291d…

Gitlab和Jenkins集成 实现CI (二)

Gitlab和Jenkins集成 实现CI (一) Gitlab和Jenkins集成 实现CI (二) Gitlab和Jenkins集成 实现CI (三) 配置Gitlab api token 配置 Gitlab 进入gitlab #mermaid-svg-t84fR8wrT4sB4raQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:…

单例模式:懒汉饿汉线程安全问题

在我们前几篇文章中都了解了一些关于线程的知识&#xff0c;那么在多线程的情况下如何创建单例模式&#xff0c;其中的线程安全问题如何解决&#xff1f; 目录 1.什么是单例模式&#xff1f; (饿汉模式) 2.单例模式(懒汉模式) *懒汉模式与懒汉模式的对比 *如何解决懒汉模式…

【后端高频面试题--SpringBoot篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 这里写目录标题 1.什么是SpringBoot&#xff1f;它的主要特点是什么&#xff1f;2.列举一些Spri…

《剑指 Offer》专项突破 - 面试题 43 : 在完全二叉树中添加节点(两种方法 + C++ 实现)

目录 前言 方法一 方法二 前言 题目链接&#xff1a;LCR 043. 完全二叉树插入器 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 在完全二叉树中&#xff0c;除最后一层之外其他层的节点都是满的&#xff08;第 n 层有 个节点&#xff09;。最后一层的节点可能…

SQL,HQL刷题,尚硅谷

目录 相关表数据&#xff1a; 题目及思路解析&#xff1a; 汇总分析 1、查询编号为“02”的课程的总成绩 2、查询参加考试的学生个数 分组 1、查询各科成绩最高和最低的分&#xff0c;以如下的形式显示&#xff1a;课程号&#xff0c;最高分&#xff0c;最低分 2、查询每门课程…

springboot179基于javaweb的流浪宠物管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

鸿蒙开发第3篇__大数据量的列表加载性能优化

列表 是最常用到的组件 一 ForEach 渲染控制语法————Foreach Foreach的作用 遍历数组项&#xff0c;并创建相同的布局组件块在组件加载时&#xff0c; 将数组内容数据全部创建对应的组件内容&#xff0c; 渲染到页面上 const swiperImage: Resource[] {$r("app.me…

类与结构体(6)

我们上一起讲了这一期讲存储类和继承&#xff0c;这个难度很大的。 存储类 存储类主要规定了函数和变量的范围&#xff0c;在c中有这些存储类↓&#xff1a; ৹ auto&#xff08;自动判断函数是什么类型&#xff09; ৹ register (常用的变量和inline差不多&#xff0c;但应…

Netty应用——通过WebSocket编程实现服务器和客户端长连接(十八)

Http协议是无状态的&#xff0c;浏览器和服务器间的请求响应一次&#xff0c;下一次会重新创建连接要求:实现基于webSocket的长连接的全双工的交互改变Http协议多次请求的约束&#xff0c;实现长连接了&#xff0c; 服务器可以发送消息给浏览器客户端浏览器和服务器端会相互感知…