day10 11-牛客67道剑指offer-JZ37 、54、41、59、12、13、14、82、9、22

news2024/11/24 0:39:16

文章目录

  • 1. JZ37 序列化二叉树
  • 2. JZ54 二叉搜索树的第k个节点
  • 3. JZ41 数据流中的中位数
    • 数组
  • 4. JZ59 滑动窗口的最大值
  • 5. JZ12 矩阵中的路径
  • 6. JZ13 机器人的运动范围
  • 7. JZ14 剪绳子
    • 乘方
    • dp
  • 8. JZ82 二叉树中和为某一值的路径(一)
  • 9. JZ9 用两个栈实现队列
  • 10. JZ22 链表中倒数最后k个结点

1. JZ37 序列化二叉树

在这里插入图片描述

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
#include <string>
class Solution {
private:
    string toSerialize(TreeNode *root)
    {
        if(root == nullptr)
            return "#!";
        string str;
        str += to_string(root->val) +"!";//加一个 ! 隔开每一个节点
        str += toSerialize(root->left);
        str += toSerialize(root->right);
        return str;
    }
    TreeNode* toTreenode(char*& str)
    {
        //说明是空指针
        if(*str == '#')
        {
            str++;
            return nullptr;
        }
        //把当前字符转成数字 有可能是个多位数
        int num = 0;
        while(*str != '!')
        {
            num = num*10 + *str-'0';
            str++;
        }
        TreeNode* node = new TreeNode(num);
        node->left = toTreenode(++str);
        node->right = toTreenode(++str);
        return node;
    }

public:
    char* Serialize(TreeNode *root) {    
        string str = toSerialize(root);
        char* result = new char[str.size()];//result是一个指针,存放在栈区,指向堆区的一块 str.size() 字节的区域的首地址
        for(int i=0; i<str.size(); i++)
        {
            
            result[i] = str[i];
            //cout << "str = " << str[i] << "  res = " << result[i] << endl;
        }
        return result;
    }
    TreeNode* Deserialize(char *str) {
        return toTreenode(str);
    }
};

2. JZ54 二叉搜索树的第k个节点

在这里插入图片描述

  • 中序遍历+迭代+栈,两种写法,一个是if用法,一共是while用法。
/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    int KthNode(TreeNode* proot, int k) {
        //中序遍历
        if(proot == nullptr) return -1;
        stack<TreeNode*> st;
        TreeNode* cur = proot;
        while(!st.empty() || cur != nullptr)
        {
            //写法1
            /*
            if(cur != nullptr)
            {
                st.push(cur);
                cur = cur->left;
            }
            else {
                cur = st.top();
                st.pop();
                k--;
                if(k==0) return cur->val;
                cur = cur->right;
            }
            */
            //写法2
            while(cur != nullptr)
            {
                st.push(cur);
                cur = cur->left;
            }
            cur = st.top();
            st.pop();
            k--;
            if(k == 0) return cur->val;
            cur = cur->right;
        }
        return -1;
    }
};
  • 中序+递归
/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    int KthNode(TreeNode* proot, int k) {
        if(proot == nullptr) return -1;
        //中序遍历 递归
        inOrder(proot, k); 
        if(res != nullptr) return res->val;
        return -1;
    }
    void inOrder(TreeNode* root, int target)
    {
        if(root == nullptr || target <= 0) return;
        inOrder(root->left, target);
        count++;
        if(count == target) res = root;//记下目标节点
        inOrder(root->right, target);
    }
    TreeNode* res = nullptr;
    int count = 0;
};

3. JZ41 数据流中的中位数

在这里插入图片描述

数组

存在数组里边,然后直接输出中位数

class Solution {
public:
    void Insert(int num) {
        result.push_back(num);
    }

    double GetMedian() { 
        sort(result.begin(), result.end());
        int len = result.size();
        if(len % 2 == 0) return (result[len/2] + result[len/2 -1]) / 2.0;
        else return result[len/2];
    }
    vector<int> result;
};

  1. 根据中位数可以把数组分为如下三段: [0 ... median - 1], [median], [median ... arr.size() - 1],即[中位数的左边,中位数,中位数的右边]。
  2. 如果我有个数据结构保留[0...median-1]的数据,并且可以O(1)时间取出最大值,即arr[0...median-1]中的最大值,也就是大顶堆;
    如果我有个数据结构可以保留[median + 1 ... arr.size() - 1] 的数据, 并且可以O(1)时间取出最小值,即arr[median + 1 ... arr.size() - 1] 中的最小值,也就是小顶堆。
    然后,我们把[median],即中位数,随便放到哪个都可以。
  3. 假设[0 ... median - 1]的长度为l_len, [median + 1 ... arr.sise() - 1]的长度为 r_len.
  • 如果l_len == r_len + 1, 说明,中位数是左边数据结构的最大值
  • 如果l_len + 1 == r_len, 说明,中位数是右边数据结构的最小值
  • 如果l_len == r_len, 说明,中位数是左边数据结构的最大值与右边数据结构的最小值的平均值。
  1. GetMedian()操作算法过程为:
    初始化一个大根堆bigheap_min,存中位数左边的数据,一个小根堆smallheap_max,存中位数右边的数据。动态维护两个数据结构的大小,即最多只相差一个,保证小顶堆中最小的数也大于大顶堆中的数据。小根堆可以O(1)返回最小值的,可以大根堆O(1)返回最大值的,并且每次插入到堆中的时间复杂度为O(logn)。
  • 数据是偶数,将 大顶堆的堆顶 放在小顶堆smallheap_max中:先把当前数据num 放在大顶堆中,然后把大顶堆的堆顶 放入小顶堆中,就可以保证左边 < 右边

  • 数据是奇数,将小顶堆的堆顶 放在大顶堆bigheap_min中:先把当前数据num 放在小顶堆,然后把小顶堆的堆顶 放入大顶堆中,就可以保证左边 < 右边

  • 最后,如果是偶数,中位数是大小顶堆的堆顶的平均数;如果是奇数,中位数就是大顶堆的堆顶。一个整数与0x1做按位与运算得到的结果是0或者1,就可以判断出这个整数是偶数还是奇数。

/*
//堆
#include <queue>
class Solution {
public:
    void Insert(int num) {
        count++;
        if(count % 2 == 0)//元素个数是偶数 数据放在 大顶堆,然后将 大顶堆 堆顶 放在小顶堆
        {
            bigheap_min.push(num);
            smallheap_max.push(bigheap_min.top());
            bigheap_min.pop();
        }
        else {
            smallheap_max.push(num);
            bigheap_min.push(smallheap_max.top());
            smallheap_max.pop();
        }
    }

    double GetMedian() { 
        //0x 16进制表示,0x1最后是1,偶数的二进制表示中最后一位是0,
		//如果count是奇数,其二进制的最后一位是1,与0x1做按位与运算得到的结果是1,说明是奇数,返回左边大顶堆得最小值即可
        if(count & 0x1) return bigheap_min.top();
        else return (bigheap_min.top() + smallheap_max.top()) / 2.0;
    }
    int count = 0;
    priority_queue<int, vector<int>, less<int>> bigheap_min;//左边大顶堆 元素数值较小
    priority_queue<int, vector<int>, greater<int>> smallheap_max;//右边小顶堆 元素数值都比大顶堆大
};

4. JZ59 滑动窗口的最大值

在这里插入图片描述
牛客思路
在这里插入图片描述
双端队列deque构造单调队列,写法1

#include <deque>
class Solution {
public:
    vector<int> maxInWindows(vector<int>& num, int size) {
        //单调队列
        vector<int> result;
        deque<int> dq;//单调递减队列 存放的是下标
        if(num.size() == 0 || size == 0 || num.size() < size) return result;
        for(int i=0; i<num.size(); i++)
        {
            //cout << "i = " << i << "  num[i] = " << num[i] << "  dq.back() = " << dq.back() << "  num[dq.back()] = " << num[dq.back()]<< endl;
            //如果当前元素比队列末尾的元素大 就把队列末尾的元素先弹出 注意队列不为空
            while(!dq.empty() && num[i] > num[dq.back()])
            {
                cout << "i = " << i << "  dq.back() = " << dq.back() << endl;
                dq.pop_back();
            }
            dq.push_back(i);//再把较大的元素入队
            //判断队列的头部元素是否属于窗口
            if(dq.front() <= i - size)
                dq.pop_front();
            //如果遍历的个数 正好是窗口数 保存最大值 遍历的个数用i+1表示
            if(i + 1 >= size) result.push_back(num[dq.front()]);
        }
        return result;
    }
};

双端队列deque构造单调队列,写法2

#include <deque>
#include <vector>
class Solution {
private:
    class Myqueue {
    public:
        deque<int> que;// 使用deque来实现单调队列

        //如果队头元素=当前元素 队头元素弹出 
        //队头元素在下一个窗口失效
        void pop(int value)
        {
            if(!que.empty() && que.front() == value)
                que.pop_front();
        }

        //如果当前元素比队尾元素大 先把队尾的元素弹出,再把当前元素存入队尾 保证单调递减
        void push(int value)
        {
            while(!que.empty() && value > que.back())
                que.pop_back();
            que.push_back(value);
        }

        // 单调队列 直接返回队列头部元素即可
        int front()
        {
            return que.front();
        }
    };
public:
    vector<int> maxInWindows(vector<int>& num, int size) {
        vector<int> result;
        if(num.size() == 0 || size == 0 || num.size() < size) return result;
        //单调队列 写法2
        Myqueue myque;
        //1.先放入前size个元素
        for(int i=0; i<size; i++)
        {
            myque.push(num[i]);
        }
        //2.当前窗口的最大值
        result.push_back(myque.front());
        //3.更新窗口最大值 并保存
        for(int i=size; i<num.size(); i++)
        {
            myque.pop(num[i-size]);//更新窗口前 移除队头元素 该元素在下一个窗口失效 前面存了size-1个元素 下标就是i-size
            myque.push(num[i]);//更新窗口前 加入最后面的元素
            result.push_back(myque.front());
        }
        return result;
    }
};

5. JZ12 矩阵中的路径

在这里插入图片描述
一个和原二维数组board等大小的visited数组,是bool型的,用来记录当前位置 是否被访问过。
如果二维数组的当前字符和目标字符串str对应的字符相等,则对其上下左右四个邻字 符串分别调用dfs的递归函数,只要有一个返回true,那么就表示找到对应的字符串。

class Solution {
public:
    bool hasPath(vector<vector<char> >& matrix, string word) {
        vector<vector<bool>> visited(matrix.size(), vector<bool>(matrix[0].size()));
        if(word.size() == 0) return false;
        for(int i=0; i<matrix.size(); i++)
        {
            for(int j=0; j<matrix[0].size(); j++)
            {
                if(dfs(matrix, word, 0, i, j, visited) == true) 
                    return true;
            }
        }
        return false;
    }

    bool dfs(vector<vector<char> >& matrix, string word, int index, int i, int j, vector<vector<bool>>& visited)
    {
        if(index == word.size()) return true;//搜寻超过路径长度,符合条件,返回true
        if(i<0 || j<0 || i>=matrix.size() || j>=matrix[0].size()) return false;//访问越界,终止,返回false
        if(visited[i][j]) return false;
        if(matrix[i][j] != word[index]) return false;
        visited[i][j] = true;
        if( dfs(matrix, word, index+1, i, j-1, visited) ||   //上
            dfs(matrix, word, index+1, i, j+1, visited) ||  //下
            dfs(matrix, word, index+1, i-1, j, visited) ||  //左
            dfs(matrix, word, index+1, i+1, j, visited))   //右
                return true;
        visited[i][j] = false;
        return false;
    }
};

6. JZ13 机器人的运动范围

在这里插入图片描述
dfs 递归 和bfs 迭代两种方式

class Solution {
public:
    int movingCount(int threshold, int rows, int cols) {
        vector<vector<bool>> visited(rows, vector<bool>(cols, false));
        //当前横向位置 纵向位置 横向边界 纵向边界
        //return dfs(threshold, visited, 0, 0, rows, cols);
        //bfs
        return bfs(threshold, rows, cols, visited);
    }

    //能够搜索
    bool canInter(int threshold, int i, int j)
    {
        int sum = 0;
        //获取i每一位的值累加
        while(i > 0)
        {
            sum += i % 10;//先是个位
            i /= 10;
        }
        while(j > 0)
        {
            sum += j %10;
            j /= 10;
        }
        //小于阈值可以搜索
        return (sum <= threshold) ? true : false;
    }

    int dfs(int threshold, vector<vector<bool>>& visited, int i, int j, int rows, int cols)
    {
        //如果超出边界 当前位置访问过 当前位置不能搜索 都停止本层递归
        if(i<0 || i>=rows || j<0 || j>=cols || visited[i][j]==true || canInter(threshold, i, j)==false)
            return 0;
        
        //标记当前位置
        visited[i][j] = true;

        //所有可访问的位置数量累加 当前位置的四个方向 不需要回溯
        return  dfs(threshold, visited, i-1, j, rows, cols)     //上
                + dfs(threshold, visited, i+1, j, rows, cols)   //下
                + dfs(threshold, visited, i, j-1, rows, cols)   //左
                + dfs(threshold, visited, i, j+1, rows, cols)   //右
                + 1;    //表示的是当前位置
    }
    
    int bfs(int threshold, int rows, int cols, vector<vector<bool>>& visited)
    {
        queue<pair<int, int>> que;//记录可以搜索的位置
        if(canInter(threshold, 0, 0))//保存第一个位置
        {
            que.push(make_pair(0, 0));
            visited[0][0] = true;
        }
        int count = 0;
        int i, j;//队列中取出一个位置
        while(!que.empty())
        {
            count++;
            tie(i, j) = que.front();
            que.pop();
            //i+1 j位置 不能越界 没有访问过 可以搜索
            if(i+1 < rows && visited[i+1][j]==false && canInter(threshold, i+1, j))
            {
                visited[i+1][j] = true;
                que.push(make_pair(i+1, j));
            }
            //i j+1位置
            if(j+1 < cols && visited[i][j+1]==false && canInter(threshold, i, j+1))
            {
                visited[i][j+1] = true;
                que.push(make_pair(i, j+1));
            }
        }
        return count;
    }
};

7. JZ14 剪绳子

在这里插入图片描述
分析:
在这里插入图片描述

  1. 首先判断,0到m可能有哪些数字,实际上只可能是2或者3,也有可能是4,但是4=22,就不考虑了。
    其次,1
    5<23,16<33,比6更大的数字就更不用考虑了,肯定要继续分。
    然后,再看2和3的数量,2的数量肯定小于3个,为什么呢?因为2
    22<33,那么题目就简单了。
    总结起来,就是直接用n除以3,根据得到的余数判断是一个2、还是两个2、还是没有2就行了。
  2. 由于题目规定m>1,所以2只能是11,3只能是21,这两个特殊情况直接返回。
  3. 乘方运算的复杂度为:O(log n),用动态规划来做会耗时比较多。
    这个思路太巧妙了。

乘方

#include <climits>
class Solution {
public:
    int cutRope(int n) {
        if(n < 2) return 0;
        if(n == 2 || n==3) return n-1;
        //乘方
        int result = 1;
        //result每乘一个3,n就要减掉一个3,直到n=4结束
        while (n > 4) 
        {
            result *= 3;
            n -= 3;
        }
        //此时n=4=2*2,结果就是result * n
        result *= n;
        return result;
    }
};

dp

定义绳子长度为i时,dp[i]是分割之后的最大乘积。

  • 写法1
#include <climits>
class Solution {
public:
    int cutRope(int n) {
        if(n < 2) return 0;
        if(n == 2 || n==3) return n-1;
        //dp
        vector<int> dp(n+1, 0);
        dp[0] = 1;
        dp[1] = 1;
        for(int i=2; i<=n; i++)
        {
            //先分成两段2~i-1,i-1~i
            dp[i] = i-1;
            for(int j=2; j<i; j++)
            {
                //然后继续分,分成 2~j(长度表示j)和 j~i-1(长度表示i-j),那么就看dp[i] 和 dp[i-j] * j (新的dp[i])
                //如果不能分,分成 j(长度表示j)和 i-j(长度表示i-j),那么就看dp[i] 和 当前长度的乘积 (i-j) * j 
                dp[i] = max(dp[i], dp[i-j] * j);//继续分
                dp[i] = max(dp[i], (i-j) * j);//不能分了
            }
        }
        return dp[n];
    }
};
  • 写法2
    要注意的是,j<=i/2 ,因为 f(5) = f(1) × f(4) = f(2) × f(3) = f(3) × f(2) = f(4) × f(1) ,可以看成是从1开始,走到后面,又回来了。所以走一半即可,但一定要走到一半才行,不能小于i/2,必须是小于等于。

8. JZ82 二叉树中和为某一值的路径(一)

在这里插入图片描述

  • 写法1
/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        if(root == nullptr) return false;
        int res = 0;
        return dfs(root, sum, res);
    }
    bool dfs(TreeNode* root, int sum, int res)
    {
        if(root == nullptr) return false;
        res += root->val;
        if(!root->left && !root->right && res == sum) return true;
        return dfs(root->left, sum, res) || dfs(root->right, sum, res);
    }
};
  • 写法2
/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:   
    bool hasPathSum(TreeNode* root, int sum) {
        if(root == nullptr) return false;
        if(!root->left && !root->right && root->val == sum) return true;
        return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val);
    }
};

JZ22 链表中倒数最后k个结点
JZ18 删除链表的节点
JZ84 二叉树中和为某一值的路径(三)
JZ86 68 11 44 85 69 71 63 47 48 46 56 21 14 81 83

9. JZ9 用两个栈实现队列

在这里插入图片描述

class Solution
{
public:
    void push(int node) {
        stack1.push(node);
    }

    int pop() {
        while(!stack1.empty())
        {
            stack2.push(stack1.top());
            stack1.pop();
        }
        int res = stack2.top();
        stack2.pop();
        while (!stack2.empty()) {
            stack1.push(stack2.top());
            stack2.pop();
        }
        return res;
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

10. JZ22 链表中倒数最后k个结点

在这里插入图片描述

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pHead, int k) {
        ListNode* fast = pHead;
        if(k <= 0 || pHead==nullptr) return nullptr;
        while(k--)
        {
            if(fast->next && k>0) return nullptr;//链表没有那么长
            if(!fast->next) return pHead;//倒数最后一个 返回第一个
            fast = fast->next;
        }
        cout << fast->val << endl;
        while(fast!=nullptr)
        {
            pHead = pHead->next;
            fast = fast->next;
        }
        return pHead;
    }
};

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

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

相关文章

redis-数据类型及样例

一.string 类型数据的基本操作 1.添加/修改数据 set key value2.获取数据 get key3.删除数据 del key4.添加/修改多个数据 mset key1 value1 key2 value25.获取多个数据 mget key1 key2二.list类型的基本操作 数据存储需求&#xff1a;存储多个数据&#xff0c;并对数据…

2023,家用美容仪的“春天”来了吗?

【潮汐商业评论/原创】 编辑部的Jessica又买了一台水牙线&#xff0c;用她的话说&#xff1a;“能让自己更完美为什么不去试试呢&#xff1f;” 事实上&#xff0c;像这样的个护产品&#xff0c;Jessica不止一两个&#xff0c;从腰颈按摩仪到护肤导入仪、从全脸射频仪再到全身…

数的范围(二分模板)

大家好 我是寸铁 希望这篇题解对你有用&#xff0c;麻烦动动手指点个赞或关注&#xff0c;感谢您的关注 不清楚蓝桥杯考什么的点点下方&#x1f447; 考点秘籍 想背纯享模版的伙伴们点点下方&#x1f447; 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不…

lab2 system calls

目录 PreRead任务列表4.3 Code: Calling system calls4.4 Code: System call arguments System call tracing测试任务hints思路先看用户的trace函数trace系统调用到底是怎么作用的呢&#xff1f; 重新捋一遍系统调用的过程 Sysinfo任务hints思路 PreRead 任务列表 xv6课本 第二…

《人工智能大模型体验报告2.0》发布

ChatGPT 崛起引发新一轮生成式AI热潮&#xff0c;国内科技企业纷纷布局。据不完全统计&#xff0c;截至目前&#xff0c;国内大模型数量已达上百个。在这些大模型中&#xff0c;谁的表现最好&#xff0c;智能性最高&#xff0c;用户体验最强&#xff1f;8月12日&#xff0c;新华…

【华为认证数通高级证书实验-分享篇2】

实验拓扑 注&#xff1a;代码块为各交换机路由器中的配置命令 配置拓扑文件 实验要求 实现全网通 实验配置 SW3 [SW3]v b 10 20 [SW3]int e0/0/1 [SW3-Ethernet0/0/1]po link-t a [SW3-Ethernet0/0/1]po de v 10 [SW3-Ethernet0/0/1]int e0/0/2 [SW3-Ethernet0/0/2]po li…

【云计算原理及实战】初识云计算

该学习笔记取自《云计算原理及实战》一书&#xff0c;关于具体描述可以查阅原本书籍。 云计算被视为“革命性的计算模型”&#xff0c;因为它通过互联网自由流通使超级计算能力成为可能。 2006年8月&#xff0c;在圣何塞举办的SES&#xff08;捜索引擎战略&#xff09;大会上&a…

热电联产在综合能源系统中的选址定容研究(matlab代码)

目录 1 主要内容 目标函数 程序模型 2 部分代码 3 程序结果 1 主要内容 该程序参考《热电联产在区域综合能源系统中的定容选址研究》&#xff0c;主要针对电热综合能源系统进行优化&#xff0c;确定热电联产机组的位置和容量&#xff0c;程序以33节点电网和17节点热网为例…

Windows11 wsl2安装Ubuntu-20.04

Ubuntu系统开机报错(无法开机启动) Linux启动报错或无法启动的解决方法 Windows11 64bit系统 1.Windows11系统上&#xff0c;启用虚拟机平台 2.Windows11系统上&#xff0c;先启用"适用于Linux的Windows子系统"&#xff0c;然后在Windows11上安装Ubuntu-20.04系统 3…

软考:中级软件设计师:数据库模式、ER模型

软考&#xff1a;中级软件设计师:数据库模式、ER模型 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准…

杨氏矩阵!!!!

杨氏矩阵&#x1f438; &#x1f4d5;题目要求&#xff1a; 杨氏矩阵 题目内容&#x1f4da;&#xff1a; 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 &#x1f9e0;题…

Linux编程——进程间通信(信号灯集、消息队列)

目录 一、信号灯集1.1 概念1.2 信号灯集创建步骤⭐⭐⭐1.3 信号灯集对应函数 二、消息队列 一、信号灯集 1.1 概念 信号灯(semaphore)&#xff0c;也叫信号量。它是不同进程间或一个给定进程内部不同线程间同步的机制&#xff1b;System V的信号灯是一个或者多个信号灯的一个…

三星电子首席技术官:BSPDN技术开发计划曝光,背部供电技术创新

在ETNews的报道之后&#xff0c;三星电子的代工部门首席技术官Jung Ki-tae Jung透露了该公司在BSPDN技术开发方面的计划。 BSPDN技术是一项创新技术&#xff0c;旨在更好地利用半导体晶圆背面空间的潜力。虽然该技术尚未在全球范围内实施&#xff0c;但三星电子成为首家公开披…

ApiPost设置全局令牌

为了避免请求接口每次都要请求登录&#xff0c;获取令牌鉴权&#xff0c;我们可以设置全局令牌&#xff08;token&#xff09;&#xff0c;避免处处单独使用令牌&#xff0c;造成环境混乱&#xff0c;使用如下&#xff1a; 接口设置 我们先配置好请求接口和请求参数&#xff0…

QTreeWidget基本属性操作

文章目录 一、背景设置1、添加背景颜色之前与之后的对比1.2背景设置的两种方式 2、边框设置2.1、演示以上参数的实际效果2.1.1、无边框、虚线、实线边框演示2.1.2、边框的3D效果 一、背景设置 1、添加背景颜色之前与之后的对比 1.2背景设置的两种方式 通过QT设计界面中的改变…

基于eBPF技术构建一种应用层网络管控解决方案

引言 随着网络应用的不断发展&#xff0c;在linux系统中对应用层网络管控的需求也日益增加&#xff0c;而传统的iptables、firewalld等工具难以针对应用层进行网络管控。因此需要一种创新的解决方案来提升网络应用的可管理性。 本文将探讨如何使用eBPF技术构建一种应用层网络…

观察者模式 Observer Pattern 《游戏编程模式》学习笔记

定义 观察者模式定义了对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 这是定义&#xff0c;看不懂就看不懂吧&#xff0c;我接下来举个例子慢慢说 为什么我们需要观察者模式 我们看一个很简…

软件确认测试报告的作用,第三方测试机构进行确认测试的好处

近年来&#xff0c;随着软件产品的不断发展和普及&#xff0c;软件确认测试作为一项重要的质量保障手段也越来越受到关注&#xff0c;主要是为了检测软件产品是否符合需求规格和预期功能&#xff0c;以及是否存在缺陷和问题。对于软件产品开发商来说&#xff0c;进行确认测试是…

未济卦-物不可穷

前言&#xff1a;学无止境&#xff0c;人生没有终点&#xff0c;虽说是六十四卦的最后一卦&#xff0c;仍是“未济”&#xff0c;今天学习未济卦的卦辞和爻辞。 卦辞 亨&#xff1b;小狐汔济&#xff0c;濡其尾&#xff0c;无攸利。 序卦&#xff1a;无不可穷也&#xff0c;故…

计蒜客T1122——最长最短单词

又是一道水题&#xff0c;基本思路是从目标串中根据空格分离出来每一个单词&#xff0c;然后分别找出最大值与最小值&#xff0c;输出即可~ #include <iostream> #include <string> #include <vector> using namespace std;int main(int argc, char** argv)…