代码随想录算法训练营第三十三天 | Leetcode随机抽题检测

news2024/11/18 3:29:08

Leetcode随机抽题检测

  • 70 爬楼梯
    • 未看解答自己编写的青春版
    • 重点
    • 题解的代码
    • 日后复习重新编写
  • 118 杨辉三角
    • 未看解答自己编写的青春版
    • 重点
    • 题解的代码
    • 日后复习重新编写
  • 198 打家劫舍
    • 未看解答自己编写的青春版
    • 重点
    • 题解的代码
    • 日后复习重新编写
  • 279 完全平方数
    • 未看解答自己编写的青春版
    • 重点
      • 怎么没看出来,这道题是完全背包啊!因为是求最少的数目,所以不管是组合数求法还是排列数求法都可以,这意味着,先遍历物品还是先遍历背包都可以!
      • 完全背包:一维DP时,背包必须正序遍历,先物品后背包:求组合数;先背包后物品:求排列数。
    • 题解的代码
    • 日后复习重新编写
  • 322 零钱兑换
    • 未看解答自己编写的青春版
    • 重点
    • 题解的代码
    • 日后复习重新编写
  • 139 单词拆分
    • 未看解答自己编写的青春版
    • 重点
    • 题解的代码
    • 日后复习重新编写
  • 这几道题做下来,我觉得动态规划我又需要复习了,果然是做一道忘一道,怎么都记不住啊。
  • 300 最长递增子序列
    • 未看解答自己编写的青春版
    • 重点
      • 这个贪心+二分的思想,真的太奈斯了!之前从来没接触过。
    • 题解的代码
    • 日后复习重新编写
  • 152 乘积最大子数组
    • 未看解答自己编写的青春版
    • 重点
      • 嫌空间占用大?在最原始的DP代码编写中,发现当前状态只和前一个状态有关,那就进行状态压缩!压缩后占用空间打败60%。
    • 题解的代码
    • 日后复习重新编写
  • 416 分割等和子集
    • 未看解答自己编写的青春版
    • 重点
    • 题解的代码
    • 日后复习重新编写
  • 62 不同路径
    • 未看解答自己编写的青春版
    • 重点
    • 题解的代码
    • 日后复习重新编写
  • 64 最小路径和
    • 未看解答自己编写的青春版
    • 重点
    • 题解的代码
    • 日后复习重新编写
  • 5 最长回文子串
    • 未看解答自己编写的青春版
    • 重点
    • 题解的代码
    • 日后复习重新编写
  • 1143 最长公共子序列
    • 未看解答自己编写的青春版
    • 重点
    • 题解的代码
    • 日后复习重新编写
  • 72 编辑距离
    • 未看解答自己编写的青春版
    • 重点
    • 题解的代码
    • 日后复习重新编写

70 爬楼梯

未看解答自己编写的青春版

动态规划写多了,果然就会不太注重初始值的设置,会有些想当然,比如本题我一开始想的是,设定 dp[0] = 1 , dp[1] = 1 , 这样的结果也是正确的,但是就是可能初始化的解释性上不太好,还是设定 dp[1] dp[2] 更好一些。

class Solution:
    def climbStairs(self, n: int) -> int:
        if n <= 1:
            return 1
        dp = [0]*3
        dp[1] = 1
        dp[2] = 2
        for i in range(3,n+1):
            total = dp[1]+dp[2]
            dp[1] = dp[2]
            dp[2] = total
        return dp[2]

重点

题解的代码

日后复习重新编写

118 杨辉三角

未看解答自己编写的青春版

感觉这道题没什么DP的味道。

class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        res = [[1]]
        for i in range(1,numRows):
            temp = [1]*(i+1)
            flag = res[-1]
            for j in range(1,i):
                temp[j] = flag[j-1]+flag[j]
            res.append(temp)
        return res

重点

题解的代码

日后复习重新编写

198 打家劫舍

未看解答自己编写的青春版

其实不需要设置两个初始状态, dp[1] dp[2] ,一个 dp[1] = nums[0] 就够了,这样也不用单独处理:只有一个房屋的情况了。

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

重点

动态规划,在人为设置初始状态时,要考虑输入直接被设置好的情况,及时判断并return , 不然会导致 index 错误。

题解的代码

日后复习重新编写

279 完全平方数

未看解答自己编写的青春版

这次写了个没有提前算好的版本,比提前算法的版本要耗时啊。

class Solution:
    def numSquares(self, n: int) -> int:
        dp = [inf]*(n+1)
        dp[0] = 0
        dp[1] = 1
        if n == 1 :
            return 1
        for i in range(2,n+1):
            mini = inf
            temp = int(sqrt(i)+1)
            for j in range(1,temp):
                if i-j*j >= 0 :
                    mini = min(mini,dp[i-j*j])
            dp[i] = 1 + mini
        print(dp)
        return dp[n]

提前算好每个平方数:(注意,双重循环的循序,先遍历 item ,再遍历 n )

class Solution:
    def numSquares(self, n: int) -> int:
        items = []
        for i in range(1,int(sqrt(n))+2):
            if i*i <= n :
                items.append(i*i)

        m = len(items)
        dp = [inf]*(n+1)
        dp[0] = 0
        
        for i in range(m):
            for j in range(items[i],n+1):
                dp[j] = min(dp[j],dp[j-items[i]]+1)
        
        return dp[n]

提前算好每个平方数:(颠倒遍历顺序,耗时和第一版,不提前算好的方法,差不多了)

class Solution:
    def numSquares(self, n: int) -> int:
        items = []
        for i in range(1,int(sqrt(n))+2):
            if i*i <= n :
                items.append(i*i)

        m = len(items)
        dp = [inf]*(n+1)
        dp[0] = 0
        
        for i in range(1,n+1):
            for j in range(m):
                if i >= items[j] :
                    dp[i] = min(dp[i],dp[i-items[j]]+1)
        
        return dp[n]

重点

综上,这道题还是选用方法二,因为迭代的次数较少,可以发现,每一个数,至少都可以写为 n 个 1 相加的情况,所以我们应该先遍历 item ,去判断取不取当前 item 就好了。

统一写法:

class Solution:
    def numSquares(self, n: int) -> int:
        items = []
        for i in range(1,int(sqrt(n))+2):
            if i*i <= n :
                items.append(i*i)

        m = len(items)
        dp = [inf]*(n+1)
        dp[0] = 0
        
        for i in range(m):
            for j in range(items[i],n+1):
                dp[j] = min(dp[j],dp[j-items[i]]+1)
        
        return dp[n]

怎么没看出来,这道题是完全背包啊!因为是求最少的数目,所以不管是组合数求法还是排列数求法都可以,这意味着,先遍历物品还是先遍历背包都可以!

01背包中,二维DP数组的两个for遍历,先后顺序可以颠倒。一维DP数组的两个for循环的顺序,一定是先遍历物品,再遍历背包,另外背包要倒序遍历,因为要保证每个物品只拿一个。而如果,01背包的一维DP数组,倒序遍历背包,但是先遍历背包,再遍历物品,得到的结果是,最后的背包中只有一个物品。(这里因为背包是倒序遍历,上来就把结果位置的输出遍历掉了,此时其他位置的值还都是初始值)

完全背包,不管是一维DP数组还是二维DP数组,遍历顺序都可以颠倒,一维DP数组时,背包的遍历顺序为正序遍历,且必须是正序遍历。

但是完全背包有一个要注意的点,就是完全背包问题的拓展应用题中,会涉及组合数和排列数的问题,而01背包没有类似的问题。求组合数,必须是先遍历物品,再遍历背包;求排列数,是先遍历背包,再遍历物品、

完全背包:一维DP时,背包必须正序遍历,先物品后背包:求组合数;先背包后物品:求排列数。

题解的代码

日后复习重新编写

322 零钱兑换

未看解答自己编写的青春版

也是完全背包!也是求可能结果中的最少元素个数,所以先遍历物品或背包,都无所谓,一维DP,正序遍历。

lass Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        n = len(coins)
        dp = [inf]*(amount+1)
        if amount == 0 :
            return 0
        dp[0] = 0
        for i in range(n):
            for j in range(1,amount+1):
                if j >= coins[i] :
                    dp[j] = min(dp[j],dp[j-coins[i]]+1)
        if dp[amount]==inf :
            return -1
        else :
            return dp[amount]

重点

题解的代码

日后复习重新编写

139 单词拆分

未看解答自己编写的青春版

典型完全背包,求排列数的题目,因为字符的排列是要求顺序的.

用一维背包去写,全部顺序遍历,先遍历背包,再遍历物品.

注意这里的递推关系,要有 dp[i],并且逻辑关系是 or 。

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        n = len(wordDict)
        m = len(s)
        dp = [False]*(m+1)
        dp[0] = True
        # 典型完全背包,求排列数的题目,因为字符的排列是要求顺序的
        # 用一维背包去写,全部顺序遍历,先遍历背包,再遍历物品
        for i in range(1,m+1):
            for j in range(n):
                if i >= len(wordDict[j]):
                    if s[i-len(wordDict[j]):i]==wordDict[j] :
                        # 注意这里的递推关系,要有 dp[i],并且逻辑关系是 or
                        dp[i] = dp[i] or dp[i-len(wordDict[j])]
        return dp[m]
        

重点

题解的代码

日后复习重新编写

这几道题做下来,我觉得动态规划我又需要复习了,果然是做一道忘一道,怎么都记不住啊。

300 最长递增子序列

未看解答自己编写的青春版

DP 方法容易想到,很简单,DP数组的含义就是 dp[i] : 以 i 为结尾的最长子序列的长度。

DP方法的时间复杂度为 O(n^2) 。

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        n = len(nums)
        dp = [1]*n
        maxi = 0

        for i in range(n):
            # 判断 i>0 可以省略,因为不涉及index=i-1的操作            
            for j in range(i):
                if nums[i] > nums[j] :
                    dp[i] = max(dp[i],dp[j]+1)
            maxi = max(maxi,dp[i])
        #print(dp)
        return maxi

重点

题目进阶:时间复杂度为 O( nlogn ) 的方法是什么?

想不到。看题解。

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

这个贪心+二分的思想,真的太奈斯了!之前从来没接触过。

题解的代码

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        d = []
        for n in nums:
            if not d or n > d[-1]:
                d.append(n)
            else:
                l, r = 0, len(d) - 1
                loc = r
                while l <= r:
                    mid = (l + r) // 2
                    if d[mid] >= n:
                        loc = mid
                        r = mid - 1
                    else:
                        l = mid + 1
                d[loc] = n
        return len(d)

日后复习重新编写

152 乘积最大子数组

未看解答自己编写的青春版

用2个指标,去记录以 i 结尾的子串,最大正值和最小负值。

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        n = len(nums)
        # dp[i][0] : 以i为结尾的最大正值
        # dp[i][1] : 以i为结尾的最小负值
        dp = [[0]*2 for _ in range(n)]
        if nums[0] > 0 :
            dp[0][0] = nums[0]
        else :
            dp[0][1] = nums[0]
        # 这里初始化,如果给 maxi 为 -inf,那么就要单独考虑数组中只有一个元素的情况
        # 如果初始化为,第一个元素,就不需要特殊考虑了。
        maxi = nums[0]
        for i in range(1,n):
            if nums[i] > 0 :
                dp[i][0] = max(nums[i],dp[i-1][0]*nums[i])
                dp[i][1] = dp[i-1][1]*nums[i]
            else :
                dp[i][0] = dp[i-1][1]*nums[i]
                dp[i][1] = min(nums[i],dp[i-1][0]*nums[i])
            maxi = max(maxi,dp[i][0])
        #print(dp)
        return maxi

我的方法速度倒是挺快,但是在内存占用上只打败了5%。

重点

评论中的一种贪心的思想:很有道理
在这里插入图片描述

class Solution {
    public int maxProduct(int[] nums) {
        int a=1;  
        int max=nums[0];
        
        for(int num:nums){
            a=a*num;
            if(max<a)max=a;
            if(num==0)a=1;

        }
        a=1;
        for(int i=nums.length-1;i>=0;i--){
            a=a*nums[i];
            if(max<a)max=a;
            if(nums[i]==0)a=1;
        }  
        return max;
    }
}

嫌空间占用大?在最原始的DP代码编写中,发现当前状态只和前一个状态有关,那就进行状态压缩!压缩后占用空间打败60%。

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        n = len(nums)
        # dp[i][0] : 以i为结尾的最大正值
        # dp[i][1] : 以i为结尾的最小负值
        dp = [0,0]
        if nums[0] > 0 :
            dp[0] = nums[0]
        else :
            dp[1] = nums[0]
        # 这里初始化,如果给 maxi 为 -inf,那么就要单独考虑数组中只有一个元素的情况
        # 如果初始化为,第一个元素,就不需要特殊考虑了。
        maxi = nums[0]
        for i in range(1,n):
            if nums[i] > 0 :
                dp[0] = max(nums[i],dp[0]*nums[i])
                dp[1] = dp[1]*nums[i]
            else :
                # 在当前nums[i]是负数时,需要先保存一下dp[0],因为在dp[1]更新要用到dp[0]
                # 但是这个值已经被改变了!其他情况,不存在这种被改变的case
                temp = dp[0]
                dp[0] = dp[1]*nums[i]
                dp[1] = min(nums[i],temp*nums[i])
            maxi = max(maxi,dp[0])
        #print(dp)
        return maxi

题解的代码

日后复习重新编写

416 分割等和子集

未看解答自己编写的青春版

01背包应用的典型题,一维DP,倒序遍历背包。

class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        # 这不就是个01背包嘛
        n = len(nums)
        sumsum = sum(nums)
        if sumsum % 2 == 1 :
            return False
        target = sumsum // 2
        dp = [0]*(target+1)

        for i in range(n):
            for j in range(target,nums[i]-1,-1):
                dp[j] = max(dp[j],dp[j-nums[i]]+nums[i])
        if dp[-1]==target :
            return True
        else :
            return False

重点

题解的代码

日后复习重新编写

62 不同路径

未看解答自己编写的青春版

这道题注意初始化就可以了,

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[0] * n for _ in range(m)]
        dp[0][0]=1
        for i in range(1,m):
            dp[i][0] = 1
        for i in range(1,n):
            dp[0][i] = 1

        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]

重点

题解的代码

日后复习重新编写

64 最小路径和

未看解答自己编写的青春版

和上一题解法基本一致,但是时间和空间指标较差。

class Solution:
    def minPathSum(self, grid: List[List[int]]) -> int:
        m = len(grid)
        n = len(grid[0])
        dp = [[0]*n for _ in range(m)]
        dp[0][0] = grid[0][0]
        for i in range(1,n):
            dp[0][i] = dp[0][i-1]+grid[0][i]
        for i in range(1,m):
            dp[i][0] = dp[i-1][0]+grid[i][0]
        for i in range(1,m):
            for j in range(1,n):
                dp[i][j] = min(dp[i-1][j],dp[i][j-1])+grid[i][j]
        return dp[-1][-1]

重点

看了下评论,也没有什么更好的思路,就是最基础的动态规划题目。

题解的代码

日后复习重新编写

5 最长回文子串

未看解答自己编写的青春版

回文串,回文串!遇到和动态规划相关的回文串题目,就用这种思路!

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        dp = [[False]*n for _ in range(n)]
        left = 0
        right = 0
        # dp[i][j]代表[i,j]是否是回文串,可以由dp[i+1][j-1]推出
        for i in range(n-1,-1,-1):
            for j in range(i,n):
                if i==j :
                    dp[i][j]=True
                else :
                    if s[i]==s[j]:
                        # 这里进过思考,不需要加一个条件,防止i+1溢出
                        # 因为如果溢出,则i=n-1,那么j大于等于i,且要小于n
                        # 那么j只能是n-1,则会执行上面的判断,不会进入到下面
                        if j-i == 1 or dp[i+1][j-1] :
                            dp[i][j]=True
                            if j-i > right-left :
                                left,right = i,j
        return s[left:right+1]

重点

本题的双指针也值得学习!提供了一种另外的思路。

本质思路是:遍历每一个位置 i ,考虑两种情况,以当前位置 i 向两边进行扩散,以当前位置 i 和下一个位置 i+1 ,

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        if n <= 1 :
            return s

        start = 0
        end = 0
        for i in range(n):
            left,right = self.find_point(i,i,s)
            start,end = self.compare(end,start,right,left)

            left,right = self.find_point(i,i+1,s)
            # 注意这里,第二次比较,其实这次比较的,已经是前面,以单字符为中心的最大结果了
            # 即是上一次的 left 和 right 结果,和这次的 left right 进行比较
            start,end = self.compare(end,start,right,left)

        return s[start:end]

        

    def find_point(self,i,j,s):
        while i >= 0 and j < len(s) and s[i]==s[j] :
            i -= 1
            j += 1
        return i+1,j


    def compare(self,a,b,c,d):
        if a-b > c-d :
            return b,a
        else :
            return d,c


题解的代码

日后复习重新编写

自己复写了二分法的方法:难点在于 find 函数的理解。以及时刻抓住循环不变量:左闭右闭区间。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        start = 0
        end = 0
        # 注意区间,这里我定义为:左闭右闭
        for i in range(n):
            left,right = self.find(s,i,i)
            if right-left > end-start :
                start,end = left,right
            # 想不明白,find函数到底能不能正确处理i+1=n(即超出index)的情况
            # 那就用if逻辑把它剔除嘛,本来这种逻辑也是非法的。
            if i < n-1 :
                left,right = self.find(s,i,i+1)
                if right-left > end-start :
                    start,end = left,right
        return s[start:end+1]

    def find(self,s,i,j):
        n = len(s)
        while i >= 0 and j < n :
            # 这里注意二分法的定义,是以i,j这两个位置的元素为中心
            # abba叫以'bb'为中心,而'aba'不叫以'ab'为中心!
            # 'aba'的情况,被i=j='b'的情况所包含了
            if s[i]!=s[j]:
                break
            else :
                i-=1
                j+=1
        # 始终牢记左闭右闭规则
        return [i+1,j-1]

1143 最长公共子序列

未看解答自己编写的青春版

一开始题意理解错了,以为 text1 是母串, text2 是子串,但是重读题后,发现两个串是互相独立的,这也就意味着:dp[i][j] 更新要同时考虑 max(dp[i-1][j],dp[i][j-1]) , 所以本题也无法做状态压缩,必须是二维DP数组。

这是编辑距离的经典类型题了,dp[i][j]的意义是:text1[0:i] 和 text2[0:j] 的最长公共子序列的长度。

class Solution:
    def longestCommonSubsequence(self, text1: str, text2: str) -> int:
        n = len(text1)
        m = len(text2)
        dp = [[0]*(m+1) for _ in range(n+1)]
        for i in range(1,n+1):
            for j in range(1,m+1):
                if text1[i-1]==text2[j-1]:
                    dp[i][j] = dp[i-1][j-1]+1
                else :
                    dp[i][j] = max(dp[i-1][j],dp[i][j-1])
        return dp[-1][-1]

重点

题解的代码

日后复习重新编写

72 编辑距离

未看解答自己编写的青春版

编辑距离,主要理解两点:如何初始化;如何表示替换操作。

首先明确:插入和删除操作是互逆的,所以我们只需要考虑删除操作就可以了,其中,dp[i-1][j] , dp[i][j-1] ,都代表着删除操作,即:删除word1[i] , 用 word1[0:i-1] 和 word2[0:j] 匹配。删除word2[j] , 用 word1[0:i] 和 word2[0:j-1] 匹配。

而替换操作:dp[i-1][j-1] 将word1[i] or word2[j] 替换为相对应的那个值,这时候,word1[i] 和 word2[j] 是匹配上的,且不能用于前面子串的匹配,所以前面子串的操作个数为 : dp[i-1][j-1] 。

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        m = len(word1)
        n = len(word2)
        if n == 0:
            return m
        if m==0 :
            return n

        dp = [[0] * (n+1) for _ in range(m+1)]
        # 初始化很重要
        for i in range(1,n+1):
            dp[0][i] = i
        for i in range(1,m+1):
            dp[i][0] = i

        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 :
                    dp[i][j] = min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1
        return dp[-1][-1]

重点

如果想复习编辑距离的原理,可以复习文章。

编辑距离

题解的代码

日后复习重新编写

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

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

相关文章

WPF上位机7——MySql

MySql DML语句 db操作、表操作 字段的数据类型 修改表 表的数据操作 DQL语句 数据查询和去重查询 条件查询 模糊查询 聚合查询 分组查询 排序查询 分页查询 DCL语句 函数 字符串处理函数 数值函数 日期函数 流程函数 约束 外键约束 多表查询 内连接 外连接 自连接 子查询 列…

JavaScript-DOM

目录 DOM 访问节点 节点信息 操作节点 DOM DOM&#xff1a;Document Object Model&#xff08; 文档对象模型&#xff09; 访问节点 使用 getElement系列方法访问指定节点 getElementById()、getElementsByName()、getElementsByTagName()根据层次关系访问节点 节点属性 属…

面向对象程序三大特性一:继承(超详细)

目录 1.继承基本介绍 2.继承关系中的成员访问 2.1就近原则 2.2继承关系中的构造方法 3.super和this 4.代码块和构造方法的执行顺序 4.1在没有继承关 系时的执行顺序。 4.2继承关系上的执行顺序 5.protected的 范围 6.继承的本质分析(重要) 7.final 关键字 1.继承基本…

《动手学深度学习》-64注意力机制

沐神版《动手学深度学习》学习笔记&#xff0c;记录学习过程&#xff0c;详细的内容请大家购买书籍查阅。 b站视频链接 开源教程链接 注意力机制 生物学中的注意力提示 灵长类动物的视觉系统接受了大量的感官输入&#xff0c;这些感官输入远远超出了大脑所能够完全处理的能力…

vue 标题文字字数过长超出部分用...代替 动态显示

效果: 浏览器最大化: 浏览器缩小: 代码: html: <div class"title overflow">{{item.name}}</div> <div class"content overflow">{{item.content}}</div> css: .overflow {/* 一定要加宽度 */width: 90%;/* 文字的大小 */he…

台风来袭,这份避险防御指南一定收好

台风天气的到来&#xff0c;我们必须高度警惕&#xff01;大到暴雨、雷电、雷雨大风&#xff0c;甚至短时强降水等强对流天气&#xff0c;可能给我们的生活带来严重威胁。为了确保家人安全&#xff0c;让我们共同学习一些智慧防护措施&#xff0c;做好个人安全防范。定期关注天…

C++初阶之一篇文章让你掌握vector(理解和使用)

vector&#xff08;理解和使用&#xff09; 1.什么是vector&#xff1f;2.vector的使用2.1 vector构造函数2.2 vector迭代器&#xff08;Iterators&#xff09;函数2.2.1 begin()2.2.2 end()2.2.3 rbegin()2.2.4 rend()2.2.5 cbegin()、cend()、crbegin()和crend() C11 2.3 vec…

Java类集框架(二)

目录 1.Map&#xff08;常用子类 HashMap&#xff0c;LinkedHashMap&#xff0c;HashTable&#xff0c;TreeMap&#xff09; 2.Map的输出&#xff08;Map.Entry,iterator,foreach&#xff09; 3.数据结构 - 栈&#xff08;Stack&#xff09; 4.数据结构 - 队列&#xff08;Q…

485modbus转profinet网关连三菱变频器modbus通讯触摸屏监控

本案例介绍了如何通过485modbus转profinet网关连接威纶通与三菱变频器进行modbus通讯。485modbus转profinet网关提供了可靠的连接方式&#xff0c;使用户能够轻松地将不同类型的设备连接到同一网络中。通过使用这种网关&#xff0c;用户可以有效地管理和监控设备&#xff0c;从…

人工智能与物理学(软体机器人能量角度)的结合思考

前言 好久没有更新我的CSDN博客了&#xff0c;细细数下来已经有了16个月。在本科时期我主要研究嵌入式&#xff0c;研究生阶段对人工智能感兴趣&#xff0c;看了一些这方面的论文和视频&#xff0c;因此用博客记录了一下&#xff0c;后来因为要搞自己的研究方向&#xff0c;就…

使用Golang实现一套流程可配置,适用于广告、推荐系统的业务性框架——组合应用

在《使用Golang实现一套流程可配置&#xff0c;适用于广告、推荐系统的业务性框架——简单应用》中&#xff0c;我们看到了各种组合Handler的组件&#xff0c;如HandlerGroup和Layer。这些组件下面的子模块又是不同组件&#xff0c;比如LayerCenter的子组件是Layer。如果此时我…

Windows用户如何将cpolar内网穿透配置成后台服务,并开机自启动?

Windows用户如何将cpolar内网穿透配置成后台服务&#xff0c;并开机自启动&#xff1f; 文章目录 Windows用户如何将cpolar内网穿透配置成后台服务&#xff0c;并开机自启动&#xff1f;前置准备&#xff1a;VS Code下载后&#xff0c;默认安装即可VS CODE切换成中文语言 1. 将…

FSC 认证产品门户网站正式上线

【FSC 认证产品门户网站正式上线】 FSC 国际正式推出自助式服务平台——FSC认证产品门户网站。FSC 证书持有者均可通过该平台自行添加企业或组织的 FSC 认证产品&#xff0c;寻求更多商机&#xff1b;也可通过该门户申请参与亚马逊气候友好项目&#xff08;Amazon Climate-Frie…

低代码平台,让应用开发更简单!

一、前言 随着社会数字化进程的加速&#xff0c;旺盛的企业个性化需求和有限的专业开发人员供给之间的矛盾日益显著&#xff0c;业界亟需更快门槛、更高效率的开发方法和工具&#xff0c;低代码技术便应运而生。 低代码开发&#xff0c;是通过编写少量代码甚至无需代码&#xf…

作为一个老程序员,想对新人说什么?

前言 最近知乎上&#xff0c;有一位大佬邀请我回答下面这个问题&#xff0c;看到这个问题我百感交集&#xff0c;感触颇多。 在我是新人时&#xff0c;如果有前辈能够指导方向一下&#xff0c;分享一些踩坑经历&#xff0c;或许会让我少走很多弯路&#xff0c;节省更多的学习的…

Vue3文本省略(Ellipsis)

APIs 参数说明类型默认值必传maxWidth文本最大宽度number | string‘100%’falseline最大行数numberundefinedfalsetrigger展开的触发方式‘click’undefinedfalsetooltip是否启用文本提示框booleantruefalsetooltipMaxWidth提示框内容最大宽度&#xff0c;单位px&#xff0c;…

数据结构--单链表OJ题

上文回顾---单链表 这章将来做一些链表的相关题目。 目录 1.移除链表元素 2.反转链表 3.链表的中间结点 4.链表中的倒数第k个结点 5.合并两个有序链表 6.链表分割 7.链表的回文结构 8.相交链表 9.环形链表 ​编辑 10.环形链表II ​编辑 ​编辑 1.移除链表元素 思…

Camera之元数据(meta data)和原始数据(raw data)区别(三十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

JavaScript原生将图片转成base64

1.写个html文件 <!-- 产品照片 --> <div class"mb-3"> <label for"cover" class"form-label">产品图片</label><inputtype"file"class"form-control"id"coverfile"/> </div>…

这些你不容错过的音频转换器免费推荐给你

音频格式转换技术是一种能够将不同格式的音频文件互相转换的技术。你可能会想&#xff0c;为什么要进行音频格式转换呢&#xff1f;原因可是多种多样的&#xff01;有时候你可能收到了一个音频文件&#xff0c;但却无法在你的设备上播放&#xff0c;这时候就需要将其转换为兼容…