面试算法高频08-动态规划-03

练习题

题目描述

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组 nums,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1
输入:nums = [1,2,3,1]
输出:4
解释:偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3),偷窃到的最高金额 = 1 + 3 = 4 。

示例 2
输入:nums = [2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋(金额 = 2),偷窃 3 号房屋(金额 = 9),接着偷窃 5 号房屋(金额 = 1),偷窃到的最高金额 = 2 + 9 + 1 = 12 。


最优解(动态规划 + 空间优化)

利用动态规划思想,通过滚动变量优化空间复杂度至 (O(1))。

思路
定义两个变量 firstsecond,分别表示偷到前前一间房屋和前一间房屋的最大金额。对于当前房屋,有两种选择:

  • 偷当前房屋:则总金额为 first + 当前房屋金额
  • 不偷当前房屋:则总金额为 second
    取两者最大值更新状态,逐步迭代。

代码

class Solution:  def rob(self, nums: List[int]) -> int:  if not nums:  return 0  if len(nums) == 1:  return nums[0]  first, second = nums[0], max(nums[0], nums[1])  for i in range(2, len(nums)):  first, second = second, max(second, first + nums[i])  return second  

复杂度分析

  • 时间复杂度:(O(n)),其中 (n) 是房屋数量,需遍历数组一次。
  • 空间复杂度:(O(1)),仅用两个变量存储状态。

答案解析

  • 初始化 first 为第一间房屋金额,second 为前两间房屋的较大值。
  • 从第三间房屋开始迭代,每次更新 firstsecondfirst 代表前前一间的最大值,second 代表前一间的最大值。
  • 最终 second 即为偷到最后一间房屋时的最大金额,返回该值。

题目:完全平方数

给定正整数 ( n ),找到若干个完全平方数(比如 ( 1, 4, 9, 16, \dots ))使得它们的和等于 ( n ),要求组成和的完全平方数的个数最少。

解法:动态规划

思路
定义 ( dp[i] ) 表示组成 ( i ) 的最少完全平方数个数。对于每个 ( i ),遍历小于 ( i ) 的完全平方数 ( j^2 ),通过状态转移方程 ( dp[i] = \min(dp[i], dp[i - j^2] + 1) ) 计算最小值。

代码

import mathdef numSquares(n):dp = [float('inf')] * (n + 1)dp[0] = 0for i in range(1, n + 1):max_j = int(math.sqrt(i))for j in range(1, max_j + 1):if i >= j * j:dp[i] = min(dp[i], dp[i - j * j] + 1)return dp[n]

解释

  1. 初始化 ( dp ) 数组,dp[0] = 0 表示 ( 0 ) 不需要任何完全平方数。
  2. 遍历 ( i ) 从 ( 1 ) 到 ( n ),对于每个 ( i ),遍历 ( j )(( j^2 \leq i ))。
  3. 通过状态转移方程更新 ( dp[i] ),取最小值。
  4. 最终 ( dp[n] ) 即为组成 ( n ) 的最少完全平方数个数。

时间复杂度:( O(n\sqrt{n}) ),遍历 ( n ) 次,每次遍历 ( \sqrt{n} ) 次。
空间复杂度:( O(n) ),存储 ( dp ) 数组。

此方法通过动态规划高效地计算出最少完全平方数个数,确保了算法的正确性和效率。

题目描述

给你两个单词 word1word2,请返回将 word1 转换成 word2 所使用的最少操作数。你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

最优解(Python)

from typing import Listclass Solution:def minDistance(self, word1: str, word2: str) -> int:m, n = len(word1), len(word2)# 创建二维数组,dp[i][j]表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符的最少操作数dp = [[0] * (n + 1) for _ in range(m + 1)]# 初始化边界条件for i in range(m + 1):dp[i][0] = i  # word1 前 i 个字符转换为空字符串,需要删除 i 个字符for j in range(n + 1):dp[0][j] = j  # 空字符串转换为 word2 前 j 个字符,需要插入 j 个字符# 填充 dp 数组for i in range(1, m + 1):for j in range(1, n + 1):if word1[i - 1] == word2[j - 1]:# 当前字符相同,不需要操作,直接取左上角的值dp[i][j] = dp[i - 1][j - 1]else:# 取插入、删除、替换三种操作的最小值,然后加 1(因为进行了一次操作)dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1])return dp[m][n]

最优解分析

  • 动态规划思路

    • 定义 dp[i][j] 表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符的最少操作数。
    • 边界条件
      • word1 为空字符串(i = 0),则需要插入 j 个字符才能转换为 word2 的前 j 个字符,即 dp[0][j] = j
      • word2 为空字符串(j = 0),则需要删除 i 个字符才能将 word1 的前 i 个字符转换为空字符串,即 dp[i][0] = i
    • 状态转移方程
      • word1[i - 1] == word2[j - 1] 时,当前字符相同,不需要进行插入、删除或替换操作,所以 dp[i][j] = dp[i - 1][j - 1]
      • word1[i - 1] != word2[j - 1] 时,有三种操作选择:
        • 插入:将 word1 的前 i 个字符转换为 word2 的前 j - 1 个字符(dp[i][j - 1]),再插入一个字符,操作数为 dp[i][j - 1] + 1
        • 删除:将 word1 的前 i - 1 个字符转换为 word2 的前 j 个字符(dp[i - 1][j]),再删除一个字符,操作数为 dp[i - 1][j] + 1
        • 替换:将 word1 的前 i - 1 个字符转换为 word2 的前 j - 1 个字符(dp[i - 1][j - 1]),再替换一个字符,操作数为 dp[i - 1][j - 1] + 1
          取这三种操作数的最小值,即 dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1])
  • 复杂度分析

    • 时间复杂度:( O(m \times n) ),其中 ( m ) 和 ( n ) 分别是 word1word2 的长度,需要遍历一个 ( (m + 1) \times (n + 1) ) 的二维数组。
    • 空间复杂度:( O(m \times n) ),使用了一个 ( (m + 1) \times (n + 1) ) 的二维数组来存储中间状态。

编辑距离(最少操作数转换单词)

题目描述

给定两个单词 word1word2,计算将 word1 转换成 word2 所需的最少操作数。允许的操作有三种:

  1. 插入一个字符
  2. 删除一个字符
  3. 替换一个字符
最优解:动态规划(Python实现)
from typing import Listclass Solution:def minDistance(self, word1: str, word2: str) -> int:m, n = len(word1), len(word2)# 创建二维数组 dp,其中 dp[i][j] 表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符的最少操作数dp = [[0] * (n + 1) for _ in range(m + 1)]# 初始化边界条件:当其中一个单词为空时的操作数for i in range(m + 1):dp[i][0] = i  # 删除 word1 前 i 个字符(全部删除,操作数为 i)for j in range(n + 1):dp[0][j] = j  # 插入 word2 前 j 个字符(全部插入,操作数为 j)# 填充 dp 数组for i in range(1, m + 1):for j in range(1, n + 1):if word1[i-1] == word2[j-1]:# 当前字符相同,无需操作,直接继承左上角的结果dp[i][j] = dp[i-1][j-1]else:# 当前字符不同,选择三种操作中的最小值并加 1(当前操作)dp[i][j] = 1 + min(dp[i-1][j],   # 删除 word1 的第 i 个字符(对应 word1 前 i-1 转换为 word2 前 j)dp[i][j-1],   # 插入 word2 的第 j 个字符(对应 word1 前 i 转换为 word2 前 j-1)dp[i-1][j-1]  # 替换 word1 的第 i 个字符为 word2 的第 j 个字符(对应前 i-1 和 j-1 转换))return dp[m][n]  # 返回最终结果,即两个完整单词的最少操作数
最优解分析
1. 动态规划思路

编辑距离问题是典型的动态规划问题,核心是通过子问题的解推导原问题的解。

  • 状态定义
    dp[i][j] 表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需的最少操作数。
  • 状态转移
    • 若当前字符相同(word1[i-1] == word2[j-1]),则无需操作,直接继承左上角的状态 dp[i-1][j-1]
    • 若当前字符不同,则有三种操作选择,取其中最小值并加 1(当前操作):
      1. 删除:删除 word1 的第 i 个字符,操作数为 dp[i-1][j] + 1
      2. 插入:在 word1 中插入 word2 的第 j 个字符,操作数为 dp[i][j-1] + 1
      3. 替换:将 word1 的第 i 个字符替换为 word2 的第 j 个字符,操作数为 dp[i-1][j-1] + 1
2. 边界条件
  • word1 为空(i=0)时,需要插入 word2 的前 j 个字符,操作数为 j
  • word2 为空(j=0)时,需要删除 word1 的前 i 个字符,操作数为 i
3. 复杂度分析
  • 时间复杂度:( O(m \times n) ),其中 mn 分别为两个单词的长度。需要遍历一个 ( (m+1) \times (n+1) ) 的二维数组。
  • 空间复杂度:( O(m \times n) ),使用二维数组存储中间状态。若优化空间,可压缩为一维数组(每次仅保留前一行的状态),但此处采用直观的二维数组解法,便于理解。
4. 示例推导

word1 = "horse", word2 = "ros" 为例:

  • 初始化边界:第一行和第一列分别为 0,1,2,30,1,2,3,4,5(对应插入或删除操作)。
  • 填充过程中,当字符相同时(如 h vs r 不同,o vs o 相同),根据状态转移方程逐步计算每个 dp[i][j]
  • 最终 dp[5][3] 即为结果 3(实际最少操作:horserorse(替换 h→r)→ rose(删除 r)→ ros(删除 e),共 3 步)。
总结

编辑距离问题通过动态规划将复杂的字符串转换问题分解为子问题,利用状态转移方程高效求解。关键在于正确定义状态和转移逻辑,边界条件的处理也至关重要。该解法是此类问题的经典解法,时间和空间复杂度均为多项式级别,适用于大多数实际场景。

题目描述

给定一个非负整数数组 nums,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。

示例 1
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步到下标 1,然后跳 3 步到达最后一个下标。

示例 2
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置(值为 0),无法继续跳跃到最后一个下标。

最优解(贪心算法)

通过维护当前能到达的最远位置,遍历数组时不断更新该位置,若在遍历过程中最远位置覆盖最后一个下标,则返回 True;若当前位置超过最远位置,说明无法继续跳跃,返回 False

Python代码
from typing import Listclass Solution:def canJump(self, nums: List[int]) -> bool:n = len(nums)max_reach = 0  # 初始化当前能到达的最远位置for i in range(n):# 如果当前位置在可到达范围内,则尝试更新最远位置if i <= max_reach:max_reach = max(max_reach, i + nums[i])# 提前判断是否已到达或超过最后一个下标,优化性能if max_reach >= n - 1:return Trueelse:# 当前位置超出可到达范围,无法继续跳跃break# 遍历结束后,若最远位置仍未到达最后一个下标,返回Falsereturn max_reach >= n - 1

最优解分析

思路解析
  1. 贪心策略
    每次遍历到位置 i 时,若 i 在当前最远可达位置 max_reach 内,则更新 max_reachi + nums[i](即从 i 出发能到达的最远位置)和当前 max_reach 中的较大值。

    • max_reach 在遍历过程中已覆盖最后一个下标(n-1),则直接返回 True,无需继续遍历。
    • 若某一位置 i 超出 max_reach,说明后续位置无法到达,直接跳出循环并返回 False
  2. 边界处理

    • 当数组长度为 01 时,直接返回 True(空数组题目保证输入合法,长度为 1 时无需跳跃即可到达)。
    • 遍历过程中,若 i 超过 max_reach,说明中间存在无法跨越的“断层”,直接终止遍历。
复杂度分析
  • 时间复杂度:( O(n) ),其中 ( n ) 是数组 nums 的长度。仅需遍历数组一次,每个元素处理时间为常数。
  • 空间复杂度:( O(1) ),仅使用常数级额外空间(max_reach 和循环变量)。
示例推导

以示例 2 nums = [3,2,1,0,4] 为例:

  • 初始 max_reach = 0
  • i=00 <= 0,更新 max_reach = max(0, 0+3=3),此时 max_reach=3,未达最后下标(4)。
  • i=11 <= 3,更新 max_reach = max(3, 1+2=3),仍为 3。
  • i=22 <= 3,更新 max_reach = max(3, 2+1=3),仍为 3。
  • i=33 <= 3,更新 max_reach = max(3, 3+0=3),仍为 3。
  • i=44 > 3,跳出循环,返回 False,符合预期。
关键点
  • 贪心的核心:每次尽可能扩展最远可达范围,避免重复计算中间状态。
  • 提前终止:一旦最远可达范围覆盖最后一个下标,立即返回 True,优化最坏情况下的性能。

该解法通过线性遍历和常数空间,高效解决了跳跃游戏问题,是此类问题的经典贪心解法。

题目描述

给定一个非负整数数组 nums,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。

最优解(贪心算法)

通过维护当前能到达的最远位置,遍历数组时动态更新该位置,若在遍历过程中最远位置覆盖最后一个下标,则直接返回 True;若当前位置超出最远可达范围,说明无法继续跳跃,返回 False

Python代码
from typing import Listclass Solution:def canJump(self, nums: List[int]) -> bool:n = len(nums)max_reach = 0  # 当前能到达的最远下标for i in range(n):# 如果当前位置在可达范围内,则尝试更新最远可达位置if i <= max_reach:max_reach = max(max_reach, i + nums[i])# 提前判断是否已到达终点,优化性能if max_reach >= n - 1:return Trueelse:# 当前位置不可达,后续位置也无法到达break# 遍历结束后,检查最远可达位置是否覆盖终点return max_reach >= n - 1

最优解分析

核心思路:贪心策略
  1. 维护最远可达位置
    max_reach 表示从起点出发,经过一系列跳跃后能到达的最远下标。初始时 max_reach = 0(起点位置)。

    • 遍历每个下标 i,若 imax_reach 范围内(即 i <= max_reach),说明可以从前面的某个位置跳跃到 i,此时更新 max_reachi + nums[i](从 i 出发能跳到的最远位置)和当前 max_reach 中的较大值。
    • i 超出 max_reach(即 i > max_reach),说明无法到达 i,后续下标也无法到达,直接终止遍历。
  2. 提前终止条件
    一旦 max_reach 覆盖最后一个下标(n - 1),立即返回 True,无需遍历剩余元素,优化最坏情况下的时间复杂度。

复杂度分析
  • 时间复杂度:( O(n) ),其中 ( n ) 是数组长度。每个元素仅遍历一次,每次操作均为常数时间。
  • 空间复杂度:( O(1) ),仅使用常数级额外空间(max_reach 和循环变量)。
示例推导
  • 示例 1:nums = [2, 3, 1, 1, 4]

    • i=00 <= 0max_reach = max(0, 0+2=2)2(未达终点,继续)。
    • i=11 <= 2max_reach = max(2, 1+3=4)4(已达终点 4,返回 True)。
  • 示例 2:nums = [3, 2, 1, 0, 4]

    • i=00 <= 0max_reach = 3
    • i=11 <= 3max_reach = 31+2=3)。
    • i=22 <= 3max_reach = 32+1=3)。
    • i=33 <= 3max_reach = 33+0=3)。
    • i=44 > 3,跳出循环,返回 False
关键点
  • 贪心的本质:每次尽可能扩展可达范围,避免回溯或重复计算,确保线性时间复杂度。
  • 边界处理:当数组长度为 1 时,直接返回 True(无需跳跃即可到达终点);当某位置不可达时,后续位置必然不可达,提前终止遍历。

该解法通过线性扫描和常数空间,高效解决了跳跃游戏问题,是此类问题的最优解法。

题目:跳跃游戏 II

给定一个非负整数数组 nums,你最初位于数组的第一个位置,数组中的每个元素代表你在该位置可以跳跃的最大长度。目标是使用最少的跳跃次数到达最后一个位置。

解法:贪心算法

通过维护当前跳跃的最远可达位置 max_reach 和当前跳跃的终点 end,遍历数组时更新这些变量。当到达当前跳跃的终点时,跳跃次数加 1,并将终点更新为新的最远可达位置。若最远可达位置已覆盖最后一个位置,提前结束遍历。

Python 代码
from typing import List  class Solution:  def jump(self, nums: List[int]) -> int:  n = len(nums)  steps = 0  # 跳跃次数  end = 0  # 当前跳跃的终点  max_reach = 0  # 目前能到达的最远位置  for i in range(n - 1):  max_reach = max(max_reach, i + nums[i])  if i == end:  steps += 1  end = max_reach  if end >= n - 1:  break  # 已到达或超过最后一个位置,提前结束  return steps  
算法分析
  • 时间复杂度:( O(n) ),遍历数组一次,每个元素处理时间为常数。
  • 空间复杂度:( O(1) ),仅使用常数级额外空间。

该算法通过贪心策略,每次在可跳跃范围内找到最远可达位置,确保跳跃次数最少,高效解决问题。

题目:不同路径

一个机器人位于一个 m x n 网格的左上角,每次只能向下或者向右移动一步,试图达到网格的右下角。求总共有多少条不同的路径?

解法:动态规划

定义 dp[i][j] 表示到达网格 (i, j) 位置的不同路径数。

  • 初始条件
    • 第一行 dp[0][j] = 1(只能一直向右移动)。
    • 第一列 dp[i][0] = 1(只能一直向下移动)。
  • 状态转移方程dp[i][j] = dp[i-1][j] + dp[i][j-1](从上方或左方到达)。
Python代码
from typing import List  class Solution:  def uniquePaths(self, m: int, n: int) -> int:  dp = [[1] * n for _ in range(m)]  for i in range(1, m):  for j in range(1, n):  dp[i][j] = dp[i-1][j] + dp[i][j-1]  return dp[m-1][n-1]  
优化空间(一维数组)
from typing import List  class Solution:  def uniquePaths(self, m: int, n: int) -> int:  dp = [1] * n  for i in range(1, m):  for j in range(1, n):  dp[j] += dp[j-1]  return dp[n-1]  

算法分析

  • 时间复杂度:( O(m \times n) ),两层循环遍历网格。
  • 空间复杂度
    • 二维数组:( O(m \times n) )。
    • 一维数组:( O(n) ),优化后仅用一行数组存储状态。

通过动态规划,利用状态转移方程高效计算路径数,确保每个位置的路径数由相邻位置推导而来,最终得到右下角的路径总数。

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

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

相关文章

基于 EFISH-SBC-RK3588 的无人机多光谱/红外热成像边缘计算方案

一、硬件架构设计‌ ‌核心算力平台&#xff08;EFISH-SBC-RK3588&#xff09;‌ ‌处理器性能‌&#xff1a;搭载 8 核 ARM 架构&#xff08;4Cortex-A762.4GHz 4Cortex-A551.8GHz&#xff09;&#xff0c;集成 6 TOPS NPU 与 Mali-G610 GPU&#xff0c;支持多光谱图像实时融…

Python小酷库系列:pyNest,把FastAPI程序写出Spring的味道

pyNest&#xff0c;把FastAPI程序写出Spring的风格 快速入门1、安装pyNest2、创建项目3、编写app_module.py4、编写app_service.py5、编写app_controller.py6、编写main.py7、启动程序 核心概念1、Modules2、Controllers3、Providers4、ORM Provider NestJS是风靡于Node.js圈的…

HTML 详解:从基础结构到语义标签

目录 一、HTML 是什么&#xff1f;二、HTML 的基本结构✅ 简要说明&#xff1a; 三、常见 HTML 标签讲解3.1 标题标签 <h1> ~ <h6>3.2 段落和换行3.3 超链接3.4 图像插入3.5 列表无序列表&#xff1a;有序列表&#xff1a; 3.6 表格结构 四、HTML 语义化标签详解五…

用Python做有趣的AI项目 6:AI音乐生成器(LSTM Melody Generator)

&#x1f3b5; 项目名称&#xff1a;AI音乐生成器&#xff08;LSTM Melody Generator&#xff09; &#x1f9e0; 项目简介 这个项目的目标是&#xff1a;用 AI 来自动生成简单的旋律&#xff08;MIDI格式&#xff09;&#xff0c;类似于基础的钢琴曲、背景音乐片段。 我们使…

【运维】利用任务计划程序定时重启 nssm 服务 | Windows 服务每日定时维护实践

&#x1f680; 利用任务计划程序定时重启 nssm 服务 | Windows 服务每日定时维护实践 一、前言 在 Windows 系统中&#xff0c;nssm&#xff08;Non-Sucking Service Manager&#xff09; 是一个非常好用的工具&#xff0c;可以将任意可执行程序注册为系统服务。很多运维场景…

MATLAB小试牛刀系列(1)

问题描述 某机床厂生产甲、乙两种机床&#xff0c;每台机床销售后的利润分别为 4 千元与 3 千元。生产甲机床需用 A、B 机器加工&#xff0c;加工时间分别为每台 2h 和每台 1h&#xff1b;生产乙机床需用 A、B、C 三种机器加工&#xff0c;加工时间均为每台 1h。若每天可用于加…

云原生周刊:Kubernetes v1.33 正式发布

开源项目推荐 Robusta Robusta 是一个开源的 K8s 可观测性与自动化平台&#xff0c;旨在增强 Prometheus 告警的智能化处理能力。它通过规则和 AI 技术对告警进行丰富化处理&#xff0c;自动附加相关的 Pod 日志、图表和可能的修复建议&#xff0c;支持智能分组、自动修复和高…

React速通笔记

相关视频&#xff1a; 黑马程序员前端React18入门到实战视频教程&#xff0c;从reacthooks核心基础到企业级项目开发实战&#xff08;B站评论、极客园项目等&#xff09;及大厂面试全通关_哔哩哔哩_bilibili 一、React介绍 React由Meta公司开发&#xff0c;是一个用于 构建W…

人工智能与机器学习:Python从零实现K-Means 算法

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…

【神经网络与深度学习】训练集与验证集的功能解析与差异探究

引言 在深度学习模型的训练过程中&#xff0c;训练集和验证集是两个关键组成部分&#xff0c;它们在模型性能的提升和评估中扮演着不可替代的角色。通过分析这两者的区别和作用&#xff0c;可以帮助我们深入理解模型的学习过程和泛化能力&#xff0c;同时为防止过拟合及优化超…

Macos m系列芯片环境下python3安装mysqlclient系列问题

最近学习python3&#xff0c;在安装mysqlclient的时候遇到了一些问题&#xff0c;直接使用哦pip install mysqlclient 直接报错了&#xff0c;记录一下解决方案。 环境信息 设备&#xff1a;Macbook Pro m1 系统&#xff1a;macos Sequoia 15.3.2 最终成功的python版本&#xf…

微信小程序-van-uploader的preview-size

preview-size支持数组格式 修改前修改后1、升级微信小程序里面的van版本:2、 重新构建npm3、重启微信开发工具 修改前 引用van组件的上传文件&#xff0c;设置预览图尺寸&#xff0c;刚开始设置的是preview-size“140”&#xff0c;出来的效果就是一个正方形。 修改后 1、升级…

2. 第一个网页:前端基础入门

第一个网页&#xff1a;前端基础入门 一、网页文件基础认知 1. 文件扩展名 .htm 或 .html 均为网页文件后缀&#xff0c;二者功能完全一致扩展名隐藏方法 系统设置 → 文件夹选项 → 查看 → 取消勾选「隐藏已知文件类型的扩展名」 二、前端发展简史 1. 浏览器战争与标准混…

云原生--核心组件-容器篇-7-Docker私有镜像仓库--Harbor

1、Harbor的定义与核心作用 定义&#xff1a; Harbor是由VMware开源的企业级容器镜像仓库系统&#xff0c;后捐赠给 CNCF (Cloud Native Computing Foundation)。它基于Docker Registry扩展了企业级功能&#xff0c;用于存储、分发和管理容器镜像&#xff08;如Docker、OCI标准…

Java项目与技术栈场景题深度解析

Java项目与技术栈场景题深度解析 在互联网大厂Java求职者的面试中&#xff0c;经常会被问到关于Java项目或技术栈的场景题。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官&#xff1a;马架构&#xff0c;欢迎来到我们公司的面试现场。请问您对Java…

SpringMVC 静态资源处理 mvc:default-servlet-handler

我们先来看看效果,当我把这一行注释掉的时候&#xff1a; 我们来看看页面&#xff1a; 现在我把注释去掉&#xff1a; 、 可以看到的是&#xff0c;这个时候又可以访问了 那么我们就可以想&#xff0c;这个 <mvc:default-servlet-handler />它控制着我们页面的访问…

【leetcode】最长公共子路径问题

滚动hash 滚动哈希&#xff08;rolling hash&#xff09;也叫 Rabin-Karp 字符串哈希算法&#xff0c;它是将某个字符串看成某个进制下的整数&#xff0c;并将其对应的十进制整数作为hash值。 滚动hash算法的推导 假设有一个长度为n的数组a[0],a[1],a[2],…a[n-1]&#xff0…

【Linux网络】:套接字之UDP

一、UDP和TCP协议 TCP &#xff08;Transmission Control Protocol 传输控制协议&#xff09;的特点&#xff1a; 传输层协议有连接&#xff08;在正式通信前要先建立连接&#xff09;可靠传输&#xff08;在内部帮我们做可靠传输工作&#xff09;面向字节流 UDP &#xff08;U…

React19 useOptimistic 用法

用法 乐观更新 发起异步请求时&#xff0c;先假设请求会成功立即更新 UI 给用户反馈若请求最终失败&#xff0c;再将 UI 恢复到之前的状态 const [optimisticState, addOptimistic] useOptimistic(state, updateFn) 参数 state&#xff1a;实际值&#xff0c;可以是 useSta…

Deepseek-v3+cline+vscode java自动化编程

1、Deepseek DeepSeek 充值后&#xff0c;创建apikey 2、vscode Visual Studio Code - Code Editing. Redefined 3、下载插件cline 4、配置deepeseek-v3 的密钥到cline 5、不可用 在开始的几次调用能正常使用起来&#xff0c;用了几次后&#xff0c;不能使用了&#xff0c;请求…