回溯问题(子集型回溯、组合型回溯、排列型回溯)【零神基础精讲】

news2024/11/24 11:35:37

来源0x3f:https://space.bilibili.com/206214

回溯分为【子集型回溯】【组合型回溯】【排列型回溯】

文章目录

  • 回溯基本概念
    • [17. 电话号码的字母组合](https://leetcode.cn/problems/letter-combinations-of-a-phone-number/)
  • 子集型回溯(分割问题也可以看作枚举分割点==>子集型)
    • [78. 子集](https://leetcode.cn/problems/subsets/)
      • 方法一:输入的视角(每个节点可以选择选和不选)
      • 方法二:答案的角度(枚举第一个数选谁、第二个数选谁)
    • [131. 分割回文串](https://leetcode.cn/problems/palindrome-partitioning/)
      • 思路:设每两个相邻字符间有逗号,枚举每个逗号结束位置。这样就变成了[78. 子集]问题
    • [784. 字母大小写全排列](https://leetcode.cn/problems/letter-case-permutation/)
    • [93. 复原 IP 地址](https://leetcode.cn/problems/restore-ip-addresses/)
  • 组合型回溯(剪枝技巧)
    • [77. 组合](https://leetcode.cn/problems/combinations/)
    • [216. 组合总和 III](https://leetcode.cn/problems/combination-sum-iii/)
    • [22. 括号生成](https://leetcode.cn/problems/generate-parentheses/)
  • 排列型回溯(棋盘问题也是排列型回溯)
    • [46. 全排列](https://leetcode.cn/problems/permutations/)
    • [51. N 皇后](https://leetcode.cn/problems/n-queens/)

回溯基本概念

回溯三问:

1、当前操作?

2、子问题?

3、下一个子问题?

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

17. 电话号码的字母组合

难度中等2314

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

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

img

示例 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'] 的一个数字。

回溯三问:

1、当前操作? 枚举 path[i] 要填入的字母

2、子问题? 构造字符串>=i 的部分

3、下一个子问题? 构造字符串>= i+1 的部分

class Solution {
    private static final String[] arr = new String[]{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    List<String> res = new ArrayList<>();
    public List<String> letterCombinations(String digits) {
        if(digits.equals("")) return res;
        dfs(digits, 0, new StringBuilder());
        return res;
    }

    public void dfs(String digits, int i, StringBuilder sb){
        if(i == digits.length()){
            res.add(sb.toString());
            return;
        }
        String str = arr[digits.charAt(i) - '0'];
        for(int j = 0; j < str.length(); j++){
            sb.append(str.charAt(j));
            dfs(digits, i+1, sb);
            sb.deleteCharAt(sb.length()-1);
        }
    }
}

子集型回溯(分割问题也可以看作枚举分割点==>子集型)

子集型回溯:每个元素都可以选和不选

回溯三问:

**1、当前操作?**枚举第 i 个数选/不选

2、子问题? 从下标 >=i 的数字中构造子集

3、下一个子问题? 从下标 >=i+1 的数字中构造子集


78. 子集

难度中等1931

给你一个整数数组 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 {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> cur;
    public List<List<Integer>> subsets(int[] nums) {
        cur = new ArrayList<>();
        dfs(nums, 0);
        return res;
    }
    // 每个节点可以选择选和不选
    public void dfs(int[] nums, int i){
        if(i == nums.length){
            res.add(new ArrayList<>(cur));
            return;
        }
        dfs(nums, i+1);
        cur.add(nums[i]);
        dfs(nums, i+1);
        cur.remove(cur.size()-1);
    }
}

方法二:答案的角度(枚举第一个数选谁、第二个数选谁)

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> cur;
    public List<List<Integer>> subsets(int[] nums) {
        cur = new ArrayList<>();
        dfs(nums, 0);
        return res;
    }
    // 每个节点可以选择选和不选
    public void dfs(int[] nums, int i){
        // 关键在这里, 递归入口每次记录答案
        res.add(new ArrayList<>(cur));
        if(i == nums.length){
            return;
        }
        for(int j = i; j < nums.length; j++){
            cur.add(nums[j]);
            dfs(nums, j+1);
            cur.remove(cur.size()-1);
        }
    }
}

131. 分割回文串

难度中等1387

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

回文串 是正着读和反着读都一样的字符串。

示例 1:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

示例 2:

输入:s = "a"
输出:[["a"]]

提示:

  • 1 <= s.length <= 16
  • s 仅由小写英文字母组成

思路:设每两个相邻字符间有逗号,枚举每个逗号结束位置。这样就变成了[78. 子集]问题

方法二:答案的角度(枚举字串结束位置)

class Solution {
    List<List<String>> res = new ArrayList<>();
    List<String> cur;
    public List<List<String>> partition(String s) {
        cur = new ArrayList<>();
        dfs(s, 0);
        return res;
    }

    public void dfs(String s, int i){
        if(i == s.length()){
            res.add(new ArrayList<>(cur));
            return;
        }
        //枚举字串结束位置(设以j结尾是否符合要求)
        for(int j = i; j < s.length(); j++){
            //判断一下[i, j] 部分是否为回文串
            String str = s.substring(i, j+1);
            if(isrev(str)){
                cur.add(str);
                dfs(s, j+1);
                cur.remove(cur.size()-1);
            }
        }
    }
    
    public boolean isrev(String str){
        int left = 0, right = str.length()-1;
        while(left < right){
            if(str.charAt(left) != str.charAt(right))
                return false;
            left++; right--;
        }
        return true;
    }
}

784. 字母大小写全排列

难度中等515

给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。

返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。

示例 1:

输入:s = "a1b2"
输出:["a1b2", "a1B2", "A1b2", "A1B2"]

示例 2:

输入: s = "3z4"
输出: ["3z4","3Z4"]

提示:

  • 1 <= s.length <= 12
  • s 由小写英文字母、大写英文字母和数字组成

题解:

DFS 回溯 看到题目要求组合或者集合,马上想到可以用回溯法:

回溯法本来是说对于每个元素都先考虑放它的情况,再考虑不放它的情况;

放在这道题的背景里就是,对于每个字母,先考虑放它,再考虑放它的另一种大小写形式。

class Solution {
    List<String> res = new ArrayList<>();
    public List<String> letterCasePermutation(String s) {
        dfs(s, 0, new StringBuilder());
        return res;
    }

    public void dfs(String s, int i, StringBuilder sb){
        if(i == s.length()){
            res.add(new String(sb.toString()));
            return;
        }
        // 不改
        sb.append(s.charAt(i));
        dfs(s, i+1, sb);
        sb.deleteCharAt(sb.length()-1);
        //改
        if(s.charAt(i) >= 'a' && s.charAt(i) <= 'z'){
            sb.append((char)(s.charAt(i) - 32));
            dfs(s, i+1, sb);
        }else if(s.charAt(i) >= 'A' && s.charAt(i) <= 'Z'){
            sb.append((char)(s.charAt(i) + 32));
            dfs(s, i+1, sb);
        }
        if((s.charAt(i) >= 'a' && s.charAt(i) <= 'z') || (s.charAt(i) >= 'A' && s.charAt(i) <= 'Z'))
            sb.deleteCharAt(sb.length()-1);
    }
}

93. 复原 IP 地址

难度中等1146收藏分享切换为英文接收动态反馈

有效 IP 地址 正好由四个整数(每个整数位于 0255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

  • 例如:"0.1.2.201" "192.168.1.1"有效 IP 地址,但是 "0.011.255.245""192.168.1.312""192.168@1.1"无效 IP 地址。

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

示例 1:

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

示例 2:

输入:s = "0000"
输出:["0.0.0.0"]

示例 3:

输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

提示:

  • 1 <= s.length <= 20
  • s 仅由数字组成
class Solution {
    List<String> res = new ArrayList<>(); 
    List<String> tmp = new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        dfs(s, 0);
        return res;
    }

    public void dfs(String s, int begin){
        if(tmp.size() == 4 && begin != s.length()) return;
        if(tmp.size() == 4 && begin == s.length()){
            res.add(String.join(".",tmp));
            return;
        }
        //枚举分割点
        for(int j = begin; j < s.length() && j < begin+3; j++){
            String str = s.substring(begin, j+1);
            // 每个整数位于 0 到 255 之间组成
            if(Integer.parseInt(str) <= 255){
                // 不能含有前导 0
                if(str.length() > 1 && str.charAt(0) == '0'){
                    return;
                }
                tmp.add(str);
                dfs(s, j+1);
                tmp.remove(tmp.size()-1);
            }else{
                return;
            }
        }
    }
}

组合型回溯(剪枝技巧)

77. 组合

难度中等1284

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

示例 2:

输入:n = 1, k = 1
输出:[[1]]

提示:

  • 1 <= n <= 20
  • 1 <= k <= n
class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> cur = new ArrayList<>();
    int n, k;
    public List<List<Integer>> combine(int _n, int _k) {
        n = _n;
        k = _k;
        dfs(1);
        return res;
    }

    public void dfs(int i){
        if(cur.size() == k){ // d == 0
            res.add(new ArrayList<>(cur));
            return;
        }
        for(int j = i; j <= n - (k - cur.size()) + 1 ; j++){
            cur.add(j);
            dfs(j+1);
            cur.remove(cur.size() - 1);
        }
    }
}

相同方式倒着遍历的写法

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> cur = new ArrayList<>();
    int n, k;
    public List<List<Integer>> combine(int _n, int _k) {
        n = _n; k = _k;
        dfs(n);
        return res;
    }

    public void dfs(int i){
        int d = k - cur.size();// 还要选 d 个数
        if(d == 0){ 
            res.add(new ArrayList<>(cur));
            return;
        }
        for(int j = i; j >= d; j--){
            cur.add(j);
            dfs(j-1);
            cur.remove(cur.size() - 1);
        }
    }
}

216. 组合总和 III

难度中等622

找出所有相加之和为 nk 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。

示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。

示例 3:

输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。

提示:

  • 2 <= k <= 9
  • 1 <= n <= 60
class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> cur = new ArrayList<>();
    int k;
    public List<List<Integer>> combinationSum3(int _k, int n) {
        k = _k;
        dfs(9, n);
        return res;
    }

    public void dfs(int i, int target){
        int d = k - cur.size();// 还要选 d 个数
        //剪枝
        // 首项+末项 *项数 /2  仍然比target小,就不用递归了
        if(target < 0 || target > (i*2 - d + 1) * d / 2)
            return; 
        // d = 0 , (i*2 - d + 1) * d / 2也是等于0的,就不用判断target = 0 了
        if(d == 0){ 
            res.add(new ArrayList<>(cur));
            return;
        }
        for(int j = i; j >= d; j--){
            cur.add(j);
            dfs(j-1, target-j);
            cur.remove(cur.size() - 1);
        }
    }
}

22. 括号生成

难度中等3091

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8
class Solution {
    int n;
    char[] path;
    List<String> res = new ArrayList<>();
    public List<String> generateParenthesis(int n) {
        this.n = n;
        path = new char[n * 2];
        dfs(0, 0);
        return res;
    }

    public void dfs(int i, int open){
        if(i == n * 2){
            res.add(new String(path));
        }
        if(open < n){ // 可以填左括号
            path[i] = '(';
            dfs(i+1, open+1);
        }
        if(i - open < open){ // 不可以填左括号了,只能填右括号}
            path[i] = ')';
            dfs(i+1, open);
        }
    }
}

排列型回溯(棋盘问题也是排列型回溯)

排列型和组合型的区别:组合中不能有{1,2} {2,1} 同时存在,因为他们是相同的组合

46. 全排列

难度中等2411

给定一个不含重复数字的数组 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 中的所有整数 互不相同
class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> cur = new ArrayList<>();
    boolean[] visit;
    public List<List<Integer>> permute(int[] nums) {
        visit = new boolean[nums.length];
        dfs(0, nums);
        return res;
    }

    public void dfs(int i, int[] nums){
        if(i == nums.length){
            res.add(new ArrayList<>(cur));
            return;
        }
        for(int k = 0; k < nums.length; k++){
            if(visit[k] == false){
                visit[k] = true;
                cur.add(nums[k]);
                dfs(i+1, nums);
                cur.remove(cur.size()-1);
                visit[k] = false;
            }
        }
    }

}

51. N 皇后

难度困难1648

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。

示例 1:

img

输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:[["Q"]]

提示:

  • 1 <= n <= 9

题解:https://leetcode.cn/problems/n-queens/solution/java-c-by-tizzi-i9j0/

class Solution {
    List<List<String>> ans = new ArrayList<>();
    int[] row;
    boolean[] cols, d, ud;
    int N;
    public List<List<String>> solveNQueens(int n) {
        N = n;
        cols = new boolean[n];
        d = new boolean[30];
        ud = new boolean[30];
        row = new int[n];// 用来保存第几行第几列放置Q
        dfs(0);
        return ans;
    }
    // col【】数组记录某列已经放过了皇后。col【i】= 1代表第i列已经放了一个皇后。
    // d【】 数组来记录某正对角线已经放置过了皇后。
    // ud【】数组来记录某反对角线已经放置过了皇后。
    public void dfs(int i){
        if(i == N){
            char[] arr = new char[N];
            Arrays.fill(arr, '.');
            List<String> g = new ArrayList<>();
            for(int j = 0; j < N; j++){
                arr[row[j]] = 'Q';
                g.add(new String(arr));
                arr[row[j]] = '.';
            }
            ans.add(g);
            return;
        }
        // 选择一个位置进行放置
        for(int j = 0; j < N; j++){
            // 列,对角线、反对角线判断
            if (!cols[j] && !d[i + j] && !ud[N - i + j]){
                cols[j] = d[i+j] = ud[N-i+j] = true;
                row[i] = j;
                dfs(i+1);
                cols[j] = d[i+j] = ud[N-i+j] = false;
            }
        }
    }
}

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

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

相关文章

按键中断,红外、光电、火焰传感器中断控制LED等并打印信息

需求&#xff1a;按键中断&#xff0c;红外、光电、火焰传感器中断控制LED等并打印信息重写函数部分&#xff1a;void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin) {switch(GPIO_Pin){case GPIO_PIN_9:HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_10);if(HAL_GPIO_ReadPin(GPIO…

浅析高速服务区交互一体机设备管理系统的建设与方向

很多高速公路服务区均缺乏现代化的服务思维、理念和手段&#xff0c;信息系统功能薄弱&#xff0c;服务区的自助服务终端存在功能单一、人机交互体验差、设备维护管理成本高、联动效率低、运营难等问题&#xff0c;这不仅无法支撑服务区的精细化服务和智能化管理需求&#xff0…

【视频】海康摄像头、NVR网络协议简介

1、软硬件整体架构 2、涉及的网络协议 3、协议简介 3.1 海康私有协议 设备发现SADP:进行设备的发现、激活、修改网络参数、忘记密码等; SDK:4200、系统平台的接入前端设备,协议不对外开放,但对外提供接口库; ISAPI:Intelligent Security API(智能安全API),基于HTTP传输…

C/C++每日一练(20230223)

目录 1. 数据合并 2. 回文链表 3. 完美矩形 1. 数据合并 题目描述 将两个从小到大排列的一维数组 (维长分别为 m,n , 其中 m,n≤100) 仍按从小到大的排列顺序合并到一个新的一维数组中&#xff0c;输出新的数组. 输入描述 第 1 行一个正整数 m , 表示第一个要合并的一维…

【数据结构】AVL树

AVL树一、AVL树的概念二、AVL的接口2.1 插入2.2 旋转2.2.1 左单旋2.2.2 右单旋2.2.3 左右双旋2.2.4 右左双旋三、验证四、源码一、AVL树的概念 当我们用普通的搜索树插入数据的时候&#xff0c;如果插入的数据是有序的&#xff0c;那么就退化成了一个链表&#xff0c;搜索效率…

纵然是在产业互联网的时代业已来临的大背景下,人们对于它的认识依然是短浅的

纵然是在产业互联网的时代业已来临的大背景下&#xff0c;人们对于它的认识依然是短浅的。这样一种认识的最为直接的结果&#xff0c;便是我们看到了各式各样的产业互联网平台的出现。如果一定要找到这些互联网平台的特点的话&#xff0c;以产业端为出发点&#xff0c;无疑是它…

嵌入式:UCOS移植+简单创建任务

目录 一、UCOS操作系统 二、UCOS移植 1、文件介绍 2、UCOS || 源码分析 3、打开Software文件 三、UCOS任务创建 一、UCOS操作系统 C/OS 是 Micrium 公司出品的实时操作系统&#xff0c; C/OS 目前有两个版本&#xff1a; C/OS-II 和 C/OS-III。 C/OS 是一种基于优先级…

Linux GPIO 开发指南

文章目录Linux GPIO 开发指南1 概述1.1 编写目的1.2 适用范围1.3 相关人员2 模块介绍2.1 模块功能介绍2.2 相关术语介绍2.3 总体框架2.4 state/pinmux/pinconfig2.5 源码结构介绍3 模块配置3.1 kernel menuconfig 配置3.2 device tree 源码结构和路径3.2.1 device tree 对 gpio…

Python计算 -- 内附蓝桥题:相乘

计算 ~~不定时更新&#x1f383;&#xff0c;上次更新&#xff1a;2023/02/23 &#x1f5e1;常用函数&#xff08;方法&#xff09; 1. 求一个整数的最末位 举个栗子&#x1f330; n int(input()) end n % 10蓝桥例题1 - 相乘✖️ 题目描述 本题为填空题&#xff0c;…

MySQL 11:MySQL锁

锁是一种机制&#xff0c;计算机通过这种机制协调多个进程或线程对资源的并发访问&#xff08;以避免争用&#xff09;。在数据库中&#xff0c;除了传统的计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争夺外&#xff0c;数据也是一种被众多用户共享的资源。如何保证并…

叠氮炔点击化学634926-63-9,Propargyl-PEG1-NHBoc,氨基叔丁酯PEG1丙炔基相关性质分享

●外观以及性质&#xff1a;Propargyl-PEG1-NHBoc产物呈固体或粘性液体&#xff0c;取决于PEG分子量&#xff0c;包含1个丙炔基和一个氨基叔丁酯&#xff0c;炔丙基可通过铜催化的叠氮炔点击化学与含叠氮化合物或生物分子反应&#xff0c;以产生稳定的三唑键&#xff0c;带有 P…

Windows下载安装Redis的详细步骤

目录 一、概述 1.redis的版本维护介绍 2.msi安装包和压缩包的优点和缺点 二、操作步骤 三、测试是否安装成功&#xff08;查看版本&#xff09; 四、获取资源 一、概述 1.redis的版本维护介绍 Redis的官网只提供Linux系统的下载。但是微软的技术团队长期开发和维护着这…

Tina_Linux_启动优化_开发指南

文章目录Tina_Linux_启动优化_开发指南1 概述2 启动速度优化简介2.1 启动流程2.2 测量方法2.2.1 printk time2.2.2 initcall_debug2.2.3 bootgraph.2.2.4 bootchart2.2.5 gpio 示波器.2.2.6 grabserial.2.3 优化方法2.3.1 boot0启动优化2.3.1.1 非安全启动.2.3.1.2 安全启动2.3…

jmeter接口自动化测试框架

接口测试可以分为两部分&#xff1a; 一是线上接口&#xff08;生产环境&#xff09;自动化测试&#xff0c;需要自动定时执行&#xff0c;每5分钟自动执行一次&#xff0c;相当于每5分钟就检查一遍线上的接口是否正常&#xff0c;有异常能够及时发现&#xff0c;不至于影响用…

易点易动助力企业固定资产信息化管理

对于生产制造或者互联网企业而言&#xff0c;固定资产比重较高&#xff0c;是企业资产的大头&#xff0c;一些办公设备、生产设备数量和金额都比较大。提升企业固定资产管理水平&#xff0c;是企业实现信息化建设的必要条件。 目前&#xff0c;国内的很多企业在固定资产管理中…

零售航母沃尔玛公布业绩:喜忧参半

2月21日美股盘前&#xff0c;零售巨无霸沃尔玛公布了截至1月的2023财年第四季度业绩报告。财报中不乏可圈可点之处&#xff0c;但是利润迎来六年首降&#xff0c;新财年的利润指引要也比预期低很多&#xff0c;可以说喜忧参半。 一、Q4业绩可圈可点 营收方面&#xff1a;在本…

漏斗分析法

一什么是漏斗分析&#xff1f; 漏斗分析是数据领域最常见的一种“程式化”数据分析方法&#xff0c;它能够科学地评估一种业务过程&#xff0c;从起点到终点&#xff0c;各个阶段的转化情况。通过可以量化的数据分析&#xff0c;帮助业务找到有问题的业务环节&#xff0c;并进…

插画网课平台排名

插画网课平台哪个好&#xff0c;插画网课排名靠前的有哪些&#xff0c;今天给大家梳理了国内5家专业的插画网课平台&#xff0c;各有优势和特色&#xff0c;给学插画的小伙伴提供选择&#xff0c;报插画网课一定要选择靠谱的&#xff0c;否则人钱两空泪两行&#xff01; 一&am…

使用 xshell 远程连接(使用 xftp 远程传输)

xshell 和 xftp的使用都基于ssh协议&#xff0c;我们需要先在远程服务端或者虚拟机上安装ssh服务&#xff0c;然后才能远程连接。 目录 1、什么是ssh协议&#xff1f; 2、安装 openssh (1) 安装 openssh 服务器 (2) 关闭服务器防火墙&#xff08;或者开放端口22&#xff09…

四个步骤在CRM系统中设置游戏化机制

长期高强度的单一工作会让销售人员逐渐失去对工作的兴趣&#xff0c;导致销售状态缺少动力和激情&#xff0c;工作开展愈加困难。不少企业通过CRM销售管理系统设置游戏化竞赛&#xff0c;调动销售人员的工作积极性。那么&#xff0c;如何在CRM系统中设置游戏化机制&#xff1f;…