算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习一(leetcode真题剖析)

news2024/12/24 9:01:34

在这里插入图片描述

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习一

  • 01.全排列
  • 02.子集
  • 03.找出所有子集的异或总和再求和
  • 04.全排列 II
  • 05.电话号码的字母组合

01.全排列

题目链接:https://leetcode.cn/problems/permutations/

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]
输出:[[1]] 

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

思路
这是一个典型的回溯问题,需要在每个位置上考虑所有可能情况,并确保不出现重复。通过深度优先搜索的方式,不断枚举每个数在当前位置的可能性,然后回溯到上一个状态,直到枚举完所有可能性得到正确的结果。

在这个问题中,可以通过一个递归函数 backtrack 和一个标记数组 visited 来实现全排列。递归函数的核心思想是在当前位置尝试放置每个数字,然后递归到下一层。同时,使用 visited 数组来判断某个数字是否已经在之前的位置出现过,以确保全排列的唯一性。

代码

class Solution {
    vector<vector<int>> ret;
    vector<int> path;
    bool cheak[7];
public:
    vector<vector<int>> permute(vector<int>& nums) {
        dfs(nums);
        return ret;
    }

    void dfs(vector<int>& nums){
        if(path.size()==nums.size()){
            ret.push_back(path);
            return;
        }

        for(int i=0;i<nums.size();++i){
            if(!cheak[i]){
                path.push_back(nums[i]);
                cheak[i]=true;
                dfs(nums);
                path.pop_back();
                cheak[i]=false;
            }
        }
    }
};

02.子集

题目链接:https://leetcode.cn/problems/subsets/

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

输入:nums = [0]
输出:[[],[0]] 

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • nums 中的所有元素 互不相同

思路

这里我们我们可以有下面两种写法,我们结合代码解释

代码一

class Solution {
    vector<vector<int>> ret;
    vector<int> path;
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        dfs(nums, 0);
        return ret;
    }

    void dfs(vector<int>& nums, int pos) {
        ret.push_back(path);

        for (int i = pos; i < nums.size(); ++i) {
            path.push_back(nums[i]);
            dfs(nums, i + 1);
            path.pop_back();
        }
    }
};

这段代码使用深度优先搜索(DFS)的思想。主要过程如下:

  1. dfs函数的一开始,将当前子集 path 加入结果集 ret
  2. 然后使用循环,从当前位置 pos 开始遍历数组 nums
  3. 对于每个元素,将其加入当前子集 path,然后递归调用 dfs 函数,继续生成包含当前元素的子集。
  4. 递归完成后,回溯,将刚刚加入的元素从当前子集 path 移出,继续循环遍历下一个元素。

这样,通过深度优先搜索,代码逐步生成了包含不同数量元素的所有子集。

代码二

class Solution {
    vector<vector<int>> ret;
    vector<int> path;
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        dfs(nums, 0);
        return ret;
    }

    void dfs(vector<int>& nums, int pos) {
        if (pos == nums.size()) {
            ret.push_back(path);
            return;
        }

        path.push_back(nums[pos]);
        dfs(nums, pos + 1);
        path.pop_back();

        dfs(nums, pos + 1);
    }
};

这段代码同样使用深度优先搜索的思想。主要过程如下:

  1. dfs函数的一开始,检查当前位置 pos 是否等于数组 nums 的大小。如果相等,表示已经处理完所有元素,将当前子集 path 加入结果集 ret,然后返回结束当前 DFS 分支。
  2. 如果当前位置 pos 不等于数组大小,将当前元素加入子集 path,然后递归调用 dfs 函数,继续生成包含当前元素的子集。
  3. 递归完成后,回溯,将刚刚加入的元素从当前子集 path 移出。
  4. 继续递归调用 dfs 函数,生成不包含当前元素的子集。

这样,同样通过深度优先搜索,代码逐步生成了包含不同数量元素的所有子集。这种实现方式在递归的不同阶段进行了两次递归调用,一次是包含当前元素的情况,一次是不包含当前元素的情况。

03.找出所有子集的异或总和再求和

题目链接:https://leetcode.cn/problems/sum-of-all-subset-xor-totals/

一个数组的 异或总和 定义为数组中所有元素按位 XOR 的结果;如果数组为 ,则异或总和为 0

  • 例如,数组 [2,5,6]异或总和2 XOR 5 XOR 6 = 1

给你一个数组 nums ,请你求出 nums 中每个 子集异或总和 ,计算并返回这些值相加之

**注意:**在本题中,元素 相同 的不同子集应 多次 计数。

数组 a 是数组 b 的一个 子集 的前提条件是:从 b 删除几个(也可能不删除)元素能够得到 a

示例 1:

输入:nums = [1,3]
输出:6
解释:[1,3] 共有 4 个子集:
- 空子集的异或总和是 0 。
- [1] 的异或总和为 1 。
- [3] 的异或总和为 3 。
- [1,3] 的异或总和为 1 XOR 3 = 2 。
0 + 1 + 3 + 2 = 6

示例 2:

输入:nums = [5,1,6]
输出:28
解释:[5,1,6] 共有 8 个子集:
- 空子集的异或总和是 0 。
- [5] 的异或总和为 5 。
- [1] 的异或总和为 1 。
- [6] 的异或总和为 6 。
- [5,1] 的异或总和为 5 XOR 1 = 4 。
- [5,6] 的异或总和为 5 XOR 6 = 3 。
- [1,6] 的异或总和为 1 XOR 6 = 7 。
- [5,1,6] 的异或总和为 5 XOR 1 XOR 6 = 2 。
0 + 5 + 1 + 6 + 4 + 3 + 7 + 2 = 28

示例 3:

输入:nums = [3,4,5,6,7,8]
输出:480
解释:每个子集的全部异或总和值之和为 480 。

提示:

  • 1 <= nums.length <= 12
  • 1 <= nums[i] <= 20

思路

这一题实际上还是和上一题类似的子集问题,只不过我们将存下的数组变为了一个值,进数组变为子集累计异或的值,出临时数组变为异或相同值,也就是删除异或过的数。

代码

class Solution {
    int sum=0,path=0;
public:
    int subsetXORSum(vector<int>& nums) {
        dfs(nums,0);
        return sum;
    }

    void dfs(vector<int>& nums,int pos){
        sum+=path;

        for(int i=pos;i<nums.size();++i){
            path^=nums[i];
            dfs(nums,i+1);
            path^=nums[i];
        }
    }
};
  1. int sum = 0, path = 0;: 这两个类成员变量用于追踪异或和的总和 (sum) 和当前正在生成的子集异或和 (path)。
  2. int subsetXORSum(vector<int>& nums): 这是主函数,用于调用 DFS 函数,并返回最终的异或和结果。
  3. void dfs(vector<int>& nums, int pos): 这是深度优先搜索(DFS)函数,用于递归生成所有子集的异或和。
    • sum += path;: 在每一层递归中,将当前子集的异或和加到总和中。
    • for(int i = pos; i < nums.size(); ++i) {: 循环从当前位置 pos 开始遍历数组 nums
    • path ^= nums[i];: 将当前元素 nums[i] 异或到当前子集异或和中。
    • dfs(nums, i + 1);: 递归调用 DFS 函数,以 i + 1 为新的起点,生成包含当前元素的子集异或和。
    • path ^= nums[i];: 回溯,将刚刚异或的元素从当前子集异或和中移出,继续循环遍历下一个元素。
  4. 最终,sum 存储了所有子集的异或和总和,该值作为结果返回。

04.全排列 II

题目链接:https://leetcode.cn/problems/permutations-ii/

定一个可包含重复数字的序列 nums按任意顺序 返回所有不重复的全排列。

示例 1:

输入:nums = [1,1,2]
输出:
[[1,1,2],
 [1,2,1],
 [2,1,1]]

示例 2:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

提示:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

思路

这里要考虑全排列,在同一节点的所有组合中,相同的元素只能选择一次,所以这里我们要有一个标记元素是否使用的数组,在后面的主逻辑递归中,有两种写法,第一种是只关心“不合法”分支,第二种是只关心“合法”分支。

代码一

class Solution {
    vector<vector<int>> ret;
    vector<int> path;
    bool cheak[9];
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        dfs(nums,0);
        return ret;
    }

    void dfs(vector<int>& nums,int pos){
        if(pos==nums.size())
        {
            ret.push_back(path);
            return;
        }

        for(int i=0;i<nums.size();++i){
            if(cheak[i]||(i!=0&&nums[i]==nums[i-1]&&cheak[i-1]==false))
                continue;
            path.push_back(nums[i]);
            cheak[i]=true;
            dfs(nums,pos+1);
            path.pop_back();
            cheak[i]=false;
        }
    }
};
  1. vector<vector<int>> ret;: 用于存储所有的全排列结果。

  2. vector<int> path;: 用于存储当前正在生成的排列。

  3. bool cheak[9];: 一个布尔数组,用于标记在当前生成排列的过程中哪些元素已经被选择。

  4. vector<vector<int>> permuteUnique(vector<int>& nums): 主函数,用于调用 DFS 函数,并返回最终的全排列结果。

  5. sort(nums.begin(), nums.end());: 在开始生成排列之前,先将输入数组排序,以便处理重复元素。

  6. void dfs(vector<int>& nums, int pos): 深度优先搜索函数,递归生成全排列。

    • if(pos == nums.size()): 如果当前位置 pos 等于数组的大小,表示已经处理完所有元素,将当前排列加入结果集。
      • ret.push_back(path);: 将当前排列加入结果集。
      • return;: 返回结束当前 DFS 分支。
    • for(int i = 0; i < nums.size(); ++i): 遍历数组中的每个元素。
      • if(cheak[i] || (i != 0 && nums[i] == nums[i-1] && cheak[i-1] == false)): 如果当前元素已经被选择(cheak[i] 为 true)或者当前元素与前一个元素相同,且前一个元素未被选择,则跳过当前循环。这是为了处理重复元素的情况,确保不会生成重复的排列。
        • continue;: 跳过当前循环,进入下一个循环。
      • path.push_back(nums[i]);: 将当前元素加入排列。
      • cheak[i] = true;: 将当前元素标记为已选择。
      • dfs(nums, pos + 1);: 递归调用 DFS 函数,继续生成下一个元素的排列。
      • path.pop_back();: 回溯,将刚刚加入的元素移出排列。
      • cheak[i] = false;: 回溯,将刚刚标记为已选择的元素重新标记为未选择。

    代码二

    class Solution {
        vector<vector<int>> ret;
        vector<int> path;
        bool cheak[9];
    public:
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            sort(nums.begin(),nums.end());
            dfs(nums,0);
            return ret;
        }
    
        void dfs(vector<int>& nums,int pos){
            if(pos==nums.size())
            {
                ret.push_back(path);
                return;
            }
    
            for(int i=0;i<nums.size();++i){
                if(!cheak[i]&&(i==0||nums[i]!=nums[i-1]||cheak[i-1]==true))
                {
                    path.push_back(nums[i]);
                    cheak[i]=true;
                    dfs(nums,pos+1);
                    path.pop_back();
                    cheak[i]=false;
                }
            }
        }
    };
    
    1. vector<vector<int>> ret;: 用于存储所有的全排列结果。
    2. vector<int> path;: 用于存储当前正在生成的排列。
    3. bool cheak[9];: 一个布尔数组,用于标记在当前生成排列的过程中哪些元素已经被选择。
    4. vector<vector<int>> permuteUnique(vector<int>& nums): 主函数,用于调用 DFS 函数,并返回最终的全排列结果。
    5. sort(nums.begin(), nums.end());: 在开始生成排列之前,先将输入数组排序,以便处理重复元素。
    6. void dfs(vector<int>& nums, int pos): 深度优先搜索函数,递归生成全排列。
      • if(pos == nums.size()): 如果当前位置 pos 等于数组的大小,表示已经处理完所有元素,将当前排列加入结果集。
        • ret.push_back(path);: 将当前排列加入结果集。
        • return;: 返回结束当前 DFS 分支。
      • for(int i = 0; i < nums.size(); ++i): 遍历数组中的每个元素。
        • if(!cheak[i] && (i == 0 || nums[i] != nums[i-1] || cheak[i-1] == true)): 如果当前元素未被选择且(是第一个元素或者与前一个元素不相同或者前一个元素已被选择),则进入循环。
          • path.push_back(nums[i]);: 将当前元素加入排列。
          • cheak[i] = true;: 将当前元素标记为已选择。
          • dfs(nums, pos + 1);: 递归调用 DFS 函数,继续生成下一个元素的排列。
          • path.pop_back();: 回溯,将刚刚加入的元素移出排列。
          • cheak[i] = false;: 回溯,将刚刚标记为已选择的元素重新标记为未选择。

05.电话号码的字母组合

题目链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"] 

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

思路

这里比前面的排列组合更为简单,只不过在这里我们需要额外创建一个哈希结构来建立数字和字母的映射关系。

代码

class Solution {
    string hash[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs","tuv", "wxyz"};
    string path;
    vector<string> ret;
public:
    vector<string> letterCombinations(string digits) {
        if(!digits.size()) return ret;
        dfs(digits,0);
        return ret;
    }

    void dfs(string& digits,int pos){
        if(pos==digits.size()){
            ret.push_back(path);
            return;
        }

        for(auto ch:hash[digits[pos]-'0']){
            path+=ch;
            dfs(digits,pos+1);
            path.pop_back();
        }
    }
};
  1. string hash[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs","tuv", "wxyz"};: 数字与对应的字母组合的映射关系,hash[2] 对应 “abc”,hash[3] 对应 “def”,以此类推。
  2. string path;: 用于存储当前正在生成的字母组合。
  3. vector<string> ret;: 用于存储所有的字母组合结果。
  4. vector<string> letterCombinations(string digits): 主函数,用于调用 DFS 函数,并返回最终的字母组合结果。
  5. if(!digits.size()) return ret;: 如果输入的数字序列为空,则直接返回空的结果集。
  6. void dfs(string& digits, int pos): 深度优先搜索函数,递归生成数字序列对应的所有字母组合。
    • if(pos == digits.size()): 如果当前位置 pos 等于数字序列的大小,表示已经处理完所有数字,将当前字母组合加入结果集。
      • ret.push_back(path);: 将当前字母组合加入结果集。
      • return;: 返回结束当前 DFS 分支。
    • for(auto ch : hash[digits[pos] - '0']): 遍历当前数字对应的所有字母。
      • path += ch;: 将当前字母加入字母组合。
      • dfs(digits, pos + 1);: 递归调用 DFS 函数,继续生成下一个数字对应的字母组合。
        )`: 主函数,用于调用 DFS 函数,并返回最终的字母组合结果。
  7. if(!digits.size()) return ret;: 如果输入的数字序列为空,则直接返回空的结果集。
  8. void dfs(string& digits, int pos): 深度优先搜索函数,递归生成数字序列对应的所有字母组合。
    • if(pos == digits.size()): 如果当前位置 pos 等于数字序列的大小,表示已经处理完所有数字,将当前字母组合加入结果集。
      • ret.push_back(path);: 将当前字母组合加入结果集。
      • return;: 返回结束当前 DFS 分支。
    • for(auto ch : hash[digits[pos] - '0']): 遍历当前数字对应的所有字母。
      • path += ch;: 将当前字母加入字母组合。
      • dfs(digits, pos + 1);: 递归调用 DFS 函数,继续生成下一个数字对应的字母组合。
      • path.pop_back();: 回溯,将刚刚加入的字母移出字母组合。

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

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

相关文章

二十六、直方图均衡化

项目功能实现&#xff1a;对灰度图片进行直方图均衡化操作 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 histogram_equal.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class HISTOGRAM_EQUAL { public:void histogram_equal(Mat…

公众号怎么线上公证?

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;公众号迁移的作用可不止变更主体这一个哦&#xff01;还可以把 A 账号的粉丝、文章素材、违规记录等迁移到 B 账号上。这样一来&#xff0c;你就可以在不失去原有粉丝的情况下&#xff0c;更好地管理和运营公众号啦…

【MySQL】连接查询和自连接的学习和总结

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-x4sPmqTXA4yupW1n {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

idea 2022.3 配置svn插件

配置中遇到的问题 1.没有安装svn.exe这个 原本是安装了TortoiseSVN 但没有安装客户端命令需要补充这个客户端命令的安装 才能引用 2.路径引用的问题 原本是在 D:\Program Files\TortoiseSVN 这里存在空格 会产生问题 网上说的使用progra~1 或者 加双引号 均不能成功 最…

SolidWorks的使用笔记

K因子 成型工具 自己设计的成型工具零件&#xff0c;保存文件类型为&#xff1a;

Servlet实现图片的上传和显示

本篇文章是在上一篇文章上改进而来 一、图片上传需要引用的jar包 链接&#xff1a;https://pan.baidu.com/s/17FLjlWlNEG5YnS_dl3C8WA 提取码&#xff1a;wbis 二、最后的结果 三、更改数据库增加图片路径字段path 四、前端页面增加图片上传按钮,和上传的复选框 代码 上传…

[c++] 工厂模式 + cyberrt 组件加载器分析

使用对象的时候&#xff0c;可以直接 new 一个&#xff0c;为什么还需要工厂模式 &#xff1f; 工厂模式属于创建型设计模式&#xff0c;将对象的创建和使用进行解耦&#xff0c;对用户隐藏了创建逻辑。 个人感觉上边的表述并没有说清楚为什么需要使用工厂模式。因为使用 new 创…

达尔克仪器设备邀您观摩2024生物发酵产品与技术装备展

参展企业介绍 达尔克本着“诚信、求精、协作、创新”的企业精神&#xff0c;以专业的技术、优良的品质和完善的服务&#xff0c;与广大客户共创辉煌未来。 我们的产品——包括水质分析、压力、温度、流量、物位等工业在线过程控制仪表、其他类型传感器以及自动化控制方案——全…

HTTPS原理及配置

HTTPS 1. 对称加密和非对称加密2. 加密算法&#xff08;了解&#xff09;3. HTTPS 协议介绍4. HTTPS 原理4.1. HTTP 访问过程4.2. HTTPS访问过程4.3. HTTPS 总结4.4. CA 证书认证机构 HTTPS 基本原理 HTTPS&#xff08;全称&#xff1a;HyperText Transfer Protocol over Secur…

模型 HBG(品牌增长)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。品牌增长法。 1 HBG(品牌增长)模型的应用 1.1 江小白使用HBG模型提高品牌知名度和销售额 选择受众市场&#xff1a;江小白的目标客户是年轻人&#xff0c;他们喜欢简单、时尚的产品。因此&#xff0c;江…

【最新Dubbo3深入理解】Dubbo3源码中的一些小技巧

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

如何用 Screen Studio 灵活高效录制可复用的教学视频?

如果你跟我一样&#xff0c;录制视频是高频刚需&#xff0c;那你不难体会到它对用户痛点的理解和解决。 挑战 作为一名教师兼 UP 主&#xff0c;我经常录制视频。 之前录制教程类视频&#xff0c;我往往采用自己的标准「懒人法」—— 从头到尾&#xff0c;用 OBS 录制屏幕和摄像…

R语言空间分析、模拟预测与可视化

随着地理信息系统&#xff08;GIS&#xff09;和大尺度研究的发展&#xff0c;空间数据的管理、统计与制图变得越来越重要。R语言在数据分析、挖掘和可视化中发挥着重要的作用&#xff0c;其中在空间分析方面扮演着重要角色&#xff0c;与空间相关的包的数量也达到130多个。在本…

Facebook群控:利用代理IP克服多账号关联

拥有多个 Facebook 帐户对于区分您的个人和企业在线形象或维护客户页面非常有用。然而&#xff0c;Facebook 的服务条款正式限制用户只能使用一个个人帐户&#xff0c;想要多账号运营&#xff0c;下面的干货必须看&#xff01; 一、Facebook群控是什么&#xff1f; Facebook群…

【安装记录】解决ssh密码正确,却无法连接到虚拟机

可能是没有允许Root登录 解决办法&#xff1a;修改/etc/ssh/sshd_config文件&#xff0c;将 PermitRootLogin 项打开

nginx 模块 常见内置变量 location

一、nginx 模块 ngx_http_core_module 核心模块 ngx_http_access_module 访问控制模块 deny allow ngx_http_auth_basic_module 身份验证 小红小名&#xff08;虚拟用户&#xff09; ftp也有虚拟用户 ngx_http_gzip_module 压缩模块 ngx_http_gzip_static_modul…

Day16_集合与泛型(泛型类与泛型接口,泛型方法,类型变量的上限与泛型的擦除,类型通配符)

文章目录 Day16 泛型学习目标1 泛型的概念1.1 没有泛型的问题1.2 泛型的引入1.2 泛型的好处1.3 泛型的定义 2 泛型类与泛型接口2.1 使用核心类库中的泛型类/接口案例一&#xff1a;Collection集合相关类型案例二&#xff1a;Comparable接口 2.2 自定义泛型类与泛型接口语法格式…

C语言中的字体背景颜色汇总

客官请看效果 客官请看代码 #include <stdio.h> #include <stdlib.h> #include <windows.h>int main() {int i;for (i 0; i < 254; i) {SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), i); // 设置当前文本颜色为循环变量对应的颜色printf(…

Maven - 代码混淆proguard-maven-plugin vs 代码加密classfinal

文章目录 proguard-maven-plugin 代码混淆官网地址入门小结 ClassFinal 代码加密介绍Gitee项目模块说明功能特性环境依赖使用说明下载加密maven插件方式无密码模式机器绑定启动加密后的jartomcat下运行加密后的war 版本说明协议声明 classfinal实战工程pom编译打包配置文件运行…

Dear ImGui的UE5.3集成实践

Dear ImGui一直较为火热&#xff0c;这是一个调试使用并且可以响应快速迭代的Gui库&#xff0c;甚至可以做到在任何代码块中调用API即显示。如果你想更多的了解一下可访问其官方网站&#xff1a;https://www.dearimgui.org/ 那么本文就来在UE5中尝试踩坑使用它。 UE4.26版本 …