leetcode动态规划问题总结 Python

目录

一、基础理论

二、例题

1. 青蛙跳台阶

2. 解密数字

3. 最长不含重复字符的子字符串

4. 连续子数组的最大和

5. 最长递增子序列

6. 最长回文字符串

7. 机器人路径条数

8. 礼物的最大价值


一、基础理论

动态规划其实是一种空间换时间的基于历史数据的递推算法,甚至有时连空间也可以节省。动态规划算法,需要 3 个步骤。第一步决定用于记录历史计算结果的数据结构,例如 dp[];第二步构建递推公式,例如 dp[n]=dp[n-1]+dp[n-2];第三步设定初始值和递推顺序,例如 dp[0]=0, dp[1]=1。

二、例题

1. 青蛙跳台阶

一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

示例:

输入:3

输出:3

本题首先使用 dp[i] 数据结构存储中间结算结果,表示 i 级台阶的跳法数量,由于要想跳到第 i 级台阶只能从第 i-1 级或者 i-2级台阶跳过来,所以递推公式为 dp[i] = dp[i-1] + dp[i-2],由于想要跳到第 1 级台阶只有一种跳法,要跳到第 2 级台阶有两种跳法,所以初始值 dp[1]=1, dp[2]=2。

def jumpFloor(n):
    if (n <= 2):
        return n
    dp = [0]*(n+1)           # 创建一个数组来保存历史数据,多补了一个用不到的0位
    dp[1] = 1                # 给出初始值
    dp[2] = 2
    for i in range(3, n+1):  # 通过关系式来计算dp[n]
        dp[i] = dp[i-1] + dp[i-2]
    return dp[n]

该问题还可以进一步扩展为:一只青蛙一次可跳上 1 级台阶,也可以跳上 2 级 … 它也可以跳上 n 级。求该青蛙跳上一个n级的台阶(n 为正整数)总共有多少种跳法。

扩展问题无法用动态规划来解,需要通过分析得到公式,具体为:

f(n)    = f(n-1) + f(n-2) + f(n-3) +… f(1)
f(n-1) =              f(n-2) + f(n-3) +… f(1)
f(n)    = 2*f(n-1)   n>1

2. 解密数字

现有一串神秘的密文 ciphertext,经调查,密文的特点和规则如下:

密文由非负整数组成,数字 0-25 分别对应字母 a-z

请根据上述规则将密文 ciphertext 解密为字母,并返回共有多少种解密结果。

示例:

输入: ciphertext = 216612

输出: 6

解释: 216612 解密后有 6 种不同的形式,分别是 "cbggbc","vggbc","vggm","cbggm","cqggbc" 和 "cqggm"

本题首先使用 dp[i] 表示长度为 i 的字符串的解法,然后分析递推公式。如果第 i-1 数字为 0,那 dp[i] == dp[i-1];如果第 i-1 数字为 1,那 dp[i] == dp[i-1] + dp[i-2];如果第 i-1 数字为 2,且第 i 数字小于 6,那 dp[i] == dp[i-1] + dp[i-2];如果第 i-1 数字大于 2,那 dp[i] == dp[i-1]。所以只需要 i-1 和 i 数字组成的数字大于等于 10 小于等于 25,则 dp[i] == dp[i-1] + dp[i-2],否则 dp[i] == dp[i-1]。需要注意,在使用 dp 时,我们在前面补一个用不到的 0,这样做的目的是让索引 i 与实际长度匹配,但是当需要访问 s 时需要注意 dp[i] 与 s[i-1] 对应。一定要理清楚 dp 与 s 的索引之间的关系,否则很容易搞混了。

def translateNum(num):
    s = str(num)

    dp = [1] * (len(s)+1)         # 定义状态列表,在0位置添加了一个1,以便于递推公式的进行,以及索引与实际长度匹配
    dp[1] = 1                     # 长度1时的解法

    for i in range(2, len(s)+1):  # 长度2到长度n的解法
        if int(s[i-2:i]) >9 and int(s[i-2:i]) < 26:  # dp[i]对应s[i-1]索引
            dp[i] = dp[i-1] + dp[i-2]
        else:
            dp[i] = dp[i-1]

    return dp[-1]

3. 最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例 :

输入: "abcabcbb"

输出: 3      解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

该问题首先使用 dp[i] 表示以 s[i] 为结点的最长不包含重复字符的字符串长度,最终结果就是 dp 中的最大值。那递推公式很容易想到,如果 s[i] 不存在于以 s[i-1] 为结点的最长不包含重复字符的字符串中,那么 dp[i] = dp[i-1] + 1;如果s[i] 存在于以 s[i-1] 为结点的最长不包含重复字符的字符串中,且重复字符所在索引是 j,那么 dp[i] = i - j。此时引出一个问题,如何获取这个字符串,如何判断一个字符是否存在于这个字符串中,以及如何获取重复字符的索引,这个还是非常困难的。所以这里采用另外一种办法,可以使用字典数据结构把所有的字符和索引均存储起来,键是字符,值是索引,当字符存在重复时,会被覆盖,所以通过这个字典可以获取 s[j] 左侧是否存在重复字符,如果存在可以获得最近的索引,如果不存在可以使用默认值 -1 表示,那么此时就可以通过 i-j 与 dp[i-1] + 1 的大小比较以判断是否存在重复字符了,但这种办法会增加内存使用量。这里初始值 dp[0] = 1。

def lengthOfLongestSubstring(s):  # 本函数有很多优化点,但为了便于理解,这里没有优化

    if not s: return 0            # 如果为空,则返回 0  || 可优化掉

    dic = {}                      # 定义哈希表,用于获取最近相同字符的索引
    dic[s[0]] = 0                 # 初始化第一个字符对应的哈希表  || 可优化掉,直接放进循环里
    dp = [1] * len(s)             # 初始化第一个字符对应的 dp  || 可优化掉,直接使用一个变量值记录
    res = 1                       # 初始化第一个字符的 res 结果

    for i in range(1, len(s)):    # 从第二个字符开始处理
        j = dic.get(s[i], -1)     # 获取 s[i] 左侧最近相同元素的索引 j
        if dp[i-1] + 1 < i - j:   # 如果 i-j 大于 dp[i-1]+1 说明在 s[j] 并不存在于以 s[j-1] 为结点的最长无重复字符串中  || 可优化为min()函数
            dp[i] = dp[i-1] + 1
        else:                     # 反之
            dp[i] = i - j

        dic[s[i]] = i             # 哈希表记录每个字符,这会造成内存使用量偏高
        res = max(res, dp[i])
        
    return res

针对本问题,这里还有一个思路,即实时维护一个集合,当向右遍历字符串时,使得集合中的元素使用对应着当前的最长无重复字符串。那此时就需要一个左指针 left 和一个右指针 i,以及需要实时维护的集合 lookup。i 需要向右遍历,所以 i 对应一个 for 循环。每遍历一个 i 值,需要首先删除集合 lookup 中与 s[i] 重复的字符左侧的所有字符,这里使用了一个很巧妙的办法,即从 left 开始一直删除,直至不存在重复。最后需要将当前字符 s[i] 放入集合中,以完成针对 i 的遍历。此方案在空间消耗上要优于方案1。

def lengthOfLongestSubstring(s):

    if not s:return 0

    left = 0                      # 左指针
    lookup = set()                # 字典

    max_len = 0
    cur_len = 0

    for i in range(len(s)):       # i是右指针,每遍历一个i,lookup都是由left到i的元素组成的字典
        cur_len += 1
        while s[i] in lookup:     # 每遍历一个i,删除lookup中的重复元素,并同步修改left
            lookup.remove(s[left])
            left += 1
            cur_len -= 1          # 附带着同步修改当前i对应字符串的长度

        if cur_len > max_len:
            max_len = cur_len

        lookup.add(s[i])
        
    return max_len

4. 连续子数组的最大和

输入一个长度为 n 的整型数组 array,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

示例:

输入:[1,-2,3,10,-4,7,2,-5]

输出:18

该问题取 dp[i] 作为以 s[i] 为结尾的连续子数组的最大和,那 max(dp) 为最终结果。递推公式为 if dp[i-1]>0: dp[i]=dp[i-1]+s[i] else: dp[i]=s[i]。

def maxSubArray(nums):
    dp = [nums[0]] * len(nums)
    for i in range(1, len(nums)):
        if dp[i-1] > 0:
            dp[i] = dp[i-1] + nums[i]
        else:
            dp[i] = nums[i]
    return max(dp)

如果不仅想要获取最大和,还需要获取最大和所对应的字符串,那就需要增加几个变量实时记录当前 dp[i] 所对应的字符串,这里其实属于滑动窗口问题了,滑动窗口的右边界很容易界定,就是遍历的参数,左边界不太好想清楚,其实左边界只有在 dp[i-1] 小于 0 的时候才会更新,且更新为 i,想明白了这一点,那就好编程了。

def maxSubArray(nums):

    dp = [nums[0]] * len(nums)
    max_value = nums[0]
    beign = 0
    end = 0
    max_beign = 0
    max_end = 0

    for i in range(1, len(nums)):
        if dp[i-1] > 0:
            dp[i] = dp[i-1] + nums[i]
        else:
            dp[i] = nums[i]
            beign = i        # 这个是最关键的点,需要想清楚
        end = i
    
        if dp[i] > max_value:
            max_value = dp[i]
            max_beign = beign
            max_end = end

    return (max_value, nums[max_beign:max_end+1])

5. 最长递增子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例:

输入:nums = [10,9,2,5,3,7,101,18]

输出:4    解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

该问题选用 dp 作为中间数据存储结构,以 dp[i] 表示以 s[i] 为结尾的最大递增子序列长度。接下来是递推公式,首先想到的是与 dp[i-1] 之间的关系,但是这次的子序列是允许跳跃的,所以不一定只是与 dp[i-1] 之间有关系,所以仔细想清楚后,发现 dp[i] 其实与 dp[0]...dp[i-1] 都有关系,需要找出来的是在 s[i]>s[index] 前提下找到 max(dp[index]...)。

def lengthOfLIS(nums):
    dp = [1]*len(nums)
    for i in range(len(nums)):
        for j in range(i):
            if nums[i] > nums[j]:
                dp[i] = max(dp[i], dp[j]+1)
    return max(dp)

如果想要同步获取这个子序列,那需要定义一个变量 result 保存所有的最长递增子序列,reslut[i] 存储的是以 s[i] 为结尾的最长递增子序列。然后在更新 dp 的时候同步更新 result。这里需要特别注意的是 [[]]*len(nums) 的方式属于浅拷贝,更新任何一个 [] 都会同步影响其它 []。在做 List 的整体赋值时一定注意好是需要赋值、浅拷贝还是深拷贝。深拷贝可以使用 copy 包或者 [:] 运算符。

import copy

def lengthOfLIS(nums):

    dp = [1]*len(nums)
    max_dp = 1
    max_i = 0

    # results = [[]]*len(nums)                # 不能这样写,这是浅拷贝
    results = [[] for _ in range(len(nums))]  # 记录以s[i]结尾的最长递增子序列

    for i in range(len(nums)):
        for j in range(i,-1,-1):              # 检查i之前所有序列
            if nums[i] > nums[j]:             # 前提是s[i]大于s[j]
                if dp[i] < dp[j] + 1:         # 次之是序列长度要更长,因为存在相等的情况,所以存在答案不唯一
                    dp[i] = dp[j] + 1
                    results[i] = copy.deepcopy(results[j])  # 注意这里一定要用深拷贝
                    # results[i] = results[j][:]            # 注意这里一定要用深拷贝
        results[i].append(nums[i])
        if max_dp < dp[i]:
            max_dp = dp[i]
            max_i = i

    return (dp[max_i], results[max_i])

6. 最长回文字符串

给你一个字符串 s,找到 s 中最长的回文字符串。

示例 :

输入:s = "babad"

输出:"bab"        解释:"aba" 同样是符合题意的答案。

本题采用二维 dp 作为中间存储数据结构,dp[i,j] 表示 s[i] 到 s[j] 是否为回文字符串,主对角线表示每个单独的字符均为长度 1 的回文字符,如果首尾两个元素相等,中间部分也是回文字符串,那当前字符串也为回文字符串,所以递推公式为 dp[i,j] = dp[i+1,j-1] and s[i]==s[j],从递推公式可以得到遍历输出是 i 从大到小 j 从小到大,至此可以获取任意字符串是否为回文字符串。在遍历的同时记录下最长长度和对应的起止点。

def longest_palindrome(s):

    dp = [[True]*len(s) for _ in range(len(s))]     # 注意深浅拷贝问题,直接相乘属于浅拷贝

    max_len = 1
    max_beign = 0
    max_end = 0

    for i in range(len(s)-2, -1, -1):
        for j in range(i+1, len(s)):
            dp[i][j] = dp[i+1][j-1] and s[i]==s[j]

            if dp[i][j] and max_len < j-i+1:        # 记录最长长度和对应起始终止位置
                max_len = j-i+1
                max_beign = i
                max_end = j

    return (max_len, s[max_beign:max_end+1])

本题还可以采用中心扩展法,即定义一个函数可以实现通过两边扩展遍历的方式寻找最长回文字符串,返回回文字符串的长度和起始点,然后遍历所有字符,检查每个字符对应的最长回文字符串,即可获取最长回文字符串。暴力遍历法的时间复杂度是O3,空间复杂度是O1,而动态规划的时间复杂度是O2,空间复杂度是O1,最后中心扩展法的时间复杂度是O2,空间复杂度是O1。

def longest_palindrome(s):

    def check(s, i, j):                             # 检查从i和j向两边扩散的字符串是否是回文字符串
        while i>=0 and j<len(s) and s[i]==s[j]:     # 实际仅仅用于 i=j 或者 i=j-1 两种情况
            i -= 1
            j += 1
        return j-i-1, i+1, j-1                      # 返回回文字符串的长度和起始以及终止点
    
    max_len = 1
    max_beign = 0
    max_end = 0
    for i in range(len(s)):
        len1, left1, right1 = check(s, i, i)
        len2, left2, right2 = check(s, i, i+1)
        if max_len < max(len1, len2):
            max_len = max(len1, len2)
            if len1 >= len2:
                max_beign = left1
                max_end = right1
            else:
                max_beign = left2
                max_end = right2    

    return s[max_beign:max_end+1]            

7. 机器人路径条数

一个机器人位于一个 mxn 网格的左上角(起始点在上图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。问总共有多少条不同的路径?

示例:

输入:m=3, n=7

输出:28

本问题需要准备一个二维的 dp 数据结构记录中间过程,dp[i,j] 表示从起点到 (i,j) 位置的路径条数,dp[-1,-1]即为最终结果。那递推公式显然就是 dp[i,j]=dp[i-1,j]+dp[i,j-1]。初始条件,第一行和第一列全部为1,递推顺序是第二行开始从左到右,从上到下。

def uniquePaths(m, n):
    dp = [[1 for _ in range(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[-1][-1]

8. 礼物的最大价值

在一个 mxn 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

示例:

输入:[ [1,3,1], [1,5,1], [4,2,1] ]

输出:12        解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物

本问题需要准备一个二维的 dp 数据结构记录中间过程,dp[i,j] 表示从起点到 (i,j) 位置的最多礼物,dp[-1,-1] 即为最终结果。那递推公式显然就是 dp[i,j]=max(dp[i-1,j]+dp[i,j-1])+grid[i,j]。初始条件,第一行和第一列全部为累计求和结果,递推顺序是第二行开始从左到右,从上到下。

def maxValue(grid):

    m, n = len(grid), len(grid[0])
    dp = [[grid[0][0] for _ in range(n)] for _ in range(m)]

    for i in range(1, m):
        dp[i][0] = dp[i-1][0] + grid[i][0]
    for j in range(1, n):
        dp[0][j] = dp[0][j-1] + grid[0][j]

    for i in range(1, m):
        for j in range(1, n):
            dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + grid[i][j]

    return dp[-1][-1]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8.2、5GMEC认识篇

MEC&#xff1a;多接入边缘计算&#xff08;Multi-access Edge Computing&#xff09;&#xff0c;强调的是边缘侧的计算服务。 MEC最大的好处是就近访问业务&#xff1a;MEC是一个资源池&#xff0c;可以部署各种服务器&#xff0c;把需要就近访问的业务部署在MEC的服务器上&a…

400G-哪个形式因素?(QSFP-DD, OSFP, CFP8)

400G收发器形式因素的发展趋势: 随着新技术的出现&#xff0c;采用新的形式因素和特点并不是什么新鲜事。400G时代即将到来&#xff0c;就像之前的技术周期一样&#xff0c;400G市场将针对特定的网络应用提供不同的收发器形式的因素。 下一代收发器外形因子有三个共同属性&am…

快速排序-排序算法

算法思想 快速排序采用的仍然是分治的思想。 Step1.每次在无序的序列中选取一个基准数。 Step2.然后将大于和小于基准数的元素分别放置于基准数两边。&#xff08;前面部分的元素均小于或等于基准数&#xff0c;后面部分均大于或等于基准数&#xff09; Step3.然后采用分治法&…

【大数据】NiFi 中的处理器(二):PutDatabaseRecord

NiFi 中的处理器&#xff08;二&#xff09;&#xff1a;PutDatabaseRecord 1.基本介绍2.属性配置3.连接关系4.应用场景 1.基本介绍 PutDatabaseRecord 处理器使用指定的 RecordReader 从传入的流文件中读取&#xff08;可能是多个&#xff0c;说数组也成&#xff09;记录。这…

仿蓝奏云网盘 /file/list SQL注入漏洞复现

0x01 产品简介 仿蓝奏网盘是一种类似于百度网盘的文件存储和共享解决方案。它为用户提供了一个便捷的平台,可以上传、存储和分享各种类型的文件,方便用户在不同设备之间进行文件传输和访问。 0x02 漏洞概述 仿蓝奏云网盘 /file/list接口处存在SQL注入漏洞,登录后台的攻击…

启英泰伦离线自然说:让语音交互更“顺口”

你是不是也有这样的烦恼&#xff1f;每次用语音控制家里的智能设备&#xff0c;总是要说那几个固定的词&#xff0c;感觉有点别扭。比如&#xff0c;每次都要说“打开空调”&#xff0c;不能换个说法吗&#xff1f; 现在&#xff0c;有了启英泰伦的离线自然说技术&#xff0c;…

Kafka之集群搭建

1. 为什么要使用kafka集群 单机服务下&#xff0c;Kafka已经具备了非常高的性能。TPS能够达到百万级别。但是&#xff0c;在实际工作中使用时&#xff0c;单机搭建的Kafka会有很大的局限性。 ​ 消息太多&#xff0c;需要分开保存。Kafka是面向海量消息设计的&#xff0c;一个T…

QT第1天

题目&#xff1a;点击按钮改变文字 需要增加一个count属性&#xff0c;并且只需要定义槽&#xff0c;信号函数已经内置好了 //widget.h#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Wi…

一文搞定SkyWalking 中Trace、Tracesegment 和 Span 的关系,非常重要!

基础概念 追踪&#xff08;Trace&#xff09; 是指一个请求或者一个操作从开始到结束的完整路径。它涵盖了分布式系统中所有相关组件的调用关系和性能信息。 跨度&#xff08;Span&#xff09; 是Trace的组成部分之一。Span代表一次调用或操作的单个组件&#xff0c;可以是…

centOS系统yum安装和卸载mongodb

0.1 什么是mongodb&#xff1f; 0.2 Mongodb是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 0.3 Mongodb是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据…

C# 关于多态性学习

前言 我相信大家都对面向对象的三个特征封装、继承、多态很熟悉&#xff0c;每个人都能说上一两句&#xff0c;但是大多数都仅仅是知道这些是什么&#xff0c;今天这篇文章是对C# 的多态性学习一下&#xff0c;巩固自己的基础&#xff0c;我们都知道同一操作作用于不同的对象&…

模板管理支持批量操作,DataEase开源数据可视化分析平台v2.2.0发布

2024年1月8日&#xff0c;DataEase开源数据可视化分析平台正式发布v2.2.0版本。 这一版本的功能升级包括&#xff1a;在“模板管理”页面中&#xff0c;用户可以通过模板管理的批量操作功能&#xff0c;对已有模板进行快速重新分类、删除等维护操作&#xff1b;数据大屏中&…

【UE Niagara学习笔记】06 - 制作火焰喷射过程中飞舞的火星

在上一篇博客&#xff08;【UE Niagara学习笔记】05 - 喷射火焰顶部的蓝色火焰&#xff09;的基础上继续实现喷射火焰的火星的效果。 目录 效果 步骤 一、创建材质实例 二、添加新的发射器 2.1 设置粒子材质 2.2 设置发射器持续生成粒子 2.3 设置粒子生成数量 2.4 设…

【麒麟V10系统x86环境--bash: ./install:/bin/bash:解释器错误: 权限不够】

不知道那位大拿分享的这个神操作、给力呀 标题-bash: ./install&#xff1a;/bin/bash&#xff1a;解释器错误: 权限不够 执行这个命令即可&#xff1b;sudo setstatus Softmode

【现代密码学】笔记3.4-3.7--构造安全加密方案、CPA安全、CCA安全 《introduction to modern cryphtography》

【现代密码学】笔记3.4-3.7--构造安全加密方案、CPA安全、CCA安全 《introduction to modern cryphtography》 写在最前面私钥加密与伪随机性 第二部分流加密与CPA多重加密 CPA安全加密方案CPA安全实验、预言机访问&#xff08;oracle access&#xff09; 操作模式伪随机函数PR…

自动化控制面板-1Panel

一、1Panel自动化控制面板 官网地址 1Panel 可以实现&#xff1a; 快速建站、高效管理、安全可靠、一键备份、应用商店 快速建站&#xff1a;深度集成 Wordpress 和 Halo&#xff0c;域名绑定、SSL 证书配置等一键搞定&#xff1b;高效管理&#xff1a;通过 Web 端轻松管理 …

构建数字化美食未来:深入了解连锁餐饮系统的技术实现

在当今数字化时代&#xff0c;连锁餐饮系统的设计与开发已成为餐饮业成功经营的重要一环。本文将深入研究连锁餐饮系统的技术实现&#xff0c;结合代码演示&#xff0c;为技术开发者和餐饮业者提供深刻的理解。 1. 技术选型与系统架构 在开始设计开发前&#xff0c;首先要考…

SD卡无法格式化怎么解决?

如何修复无法格式化的SD卡&#xff1f; 提供了4种SD卡无法格式化的解决方法&#xff0c;你可根据具体情况和需要选择合适的方法。 方法1. 更改驱动器号 有时&#xff0c;SD卡无法格式化是因为SD卡无法访问 。为了确保你的Windows操作系统能够识别并显示你的SD卡&#xff0c;…

《JVM由浅入深学习【七】 2024-01-11》JVM由简入深学习提升分享

亲爱的读者们&#xff0c;欢迎来到本篇博客&#xff0c;这是JVM第七次分享&#xff0c;下面是七个JVM常用常面的分享&#xff0c;请笑纳 目录 1. 几个与JVM 内存相关的核心参数2.如何计算一个对象的大小3.堆为什么要分为新生代和老年代4.JVM堆的年轻代为什么要有两个 Survivor…

大话 JavaScript(Speaking JavaScript):第二十一章到第二十五章

第二十一章&#xff1a;数学 原文&#xff1a;21. Math 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 Math对象用作多个数学函数的命名空间。本章提供了一个概述。 数学属性 Math的属性如下&#xff1a; Math.E 欧拉常数&#xff08;e&#xff09; Math.LN2 2 …