练习题(2024/4/26)

1所有可能的路径

给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序

 graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。

示例 1:

输入:graph = [[1,2],[3],[3],[]]
输出:[[0,1,3],[0,2,3]]
解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3

示例 2:

输入:graph = [[4,3,1],[3,2,4],[3],[4],[]]
输出:[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]

提示:

  • n == graph.length
  • 2 <= n <= 15
  • 0 <= graph[i][j] < n
  • graph[i][j] != i(即不存在自环)
  • graph[i] 中的所有元素 互不相同
  • 保证输入为 有向无环图(DAG)

深度搜索思路:

深度搜索过程:

  1. 首先从起始节点开始,将起始节点加入当前路径中,然后进行深度优先搜索。
  2. 在搜索的过程中,不断向下探索下一个邻居节点,将其加入当前路径并继续递归搜索。
  3. 当搜索到最后一个节点时,将当前路径加入结果中,表示找到了一条从起始节点到最后一个节点的路径。
  4. 接着进行回溯操作,将最后一个节点从路径中移除,然后继续搜索其他可能的分支。
  5. 重复以上步骤,直到搜索完所有可能的路径,最终得到所有从起始节点到最后一个节点的路径集合。

所以我们可以使用深度优先搜索的方式求出所有可能的路径。具体地,我们从0号点出发,使用栈记录路径上的点。每次我们遍历到点 n−1,就将栈中记录的路径加入到答案中。

  1. 首先定义了一个类Solution,其中包含了一个二维vector result 用来存放所有路径的结果,一个一维vector path 用来表示当前遍历的路径。
  2. 接着有了一个dfs函数,用来进行深度优先搜索。在dfs函数中,首先判断当前节点是否为最后一个节点,如果是则将当前路径加入结果中;否则就遍历当前节点的邻居节点。
  3. 在遍历邻居节点的过程中,将邻居节点加入当前路径中,然后继续深度优先搜索下一个节点。搜索完毕后进行回溯操作,将当前节点从路径中移除,以便继续搜索其他分支。
  4. 最后,在allPathsSourceTarget函数中,将起始节点0加入路径中,然后调用dfs函数开始进行深度优先搜索,最终返回结果中存储的所有从起始节点到最后一个节点的路径。

代码:

class Solution {
public:
    vector<vector<int>> result; // 存放所有路径的结果
    vector<int> path; // 当前遍历的路径
    void dfs(vector<vector<int>>& graph, int x){
        // 当遍历到最后一个节点时,将当前路径加入结果中
        if(x==graph.size()-1){
            result.push_back(path);
            return;
        }
        // 遍历当前节点的邻居节点
        for(int i=0;i<graph[x].size();i++){
            // 将邻居节点加入当前路径中
            path.push_back(graph[x][i]);
            // 继续深度优先搜索
            dfs(graph,graph[x][i]);
            // 回溯,将当前节点从路径中移除
            path.pop_back();
        }
    }
    // 找到从0到最后一个节点的所有路径
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        path.push_back(0); // 起始节点为0
        dfs(graph,0);
        return result;
    }
};

2岛屿数量

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:grid = [
  ["1","1","1","1","0"],
  ["1","1","0","1","0"],
  ["1","1","0","0","0"],
  ["0","0","0","0","0"]
]
输出:1

示例 2:

输入:grid = [
  ["1","1","0","0","0"],
  ["1","1","0","0","0"],
  ["0","0","1","0","0"],
  ["0","0","0","1","1"]
]
输出:3

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0' 或 '1

思路:

这道题的解题思路是利用深度优先搜索(DFS)来遍历地图中的岛屿。首先定义一个帮助函数numIslandsHelper,用于递归地标记岛屿及其连通的岛屿。然后,在主函数numIslands中遍历整个地图,如果发现未被访问过的岛屿,则调用numIslandsHelper进行标记,并同时将真实岛屿数量加一。最后返回真实岛屿数量。

具体解题步骤如下:

  1. 遍历整个地图,对每个未被访问过的岛屿(即值为’1’的位置)调用numIslandsHelper函数。
  2. numIslandsHelper函数中,将当前岛屿标记为已访问,然后递归地向该岛屿的四个方向(上、下、左、右)进行搜索,将连通的岛屿都标记为相同的字符(这里使用字符’2’)。
  3. 每次成功标记一个岛屿后,真实岛屿数量加一。
  4. 最后返回真实岛屿数量。

代码:

class Solution {
public:
    void numIslandsHelper(vector<vector<char>>& grid, int i, int j, char& num)
    {
        /* 帮助函数:深度优先搜索遍历并标记岛屿 */
        /* 参数说明:
           grid: 二维字符数组,表示地图
           i: 当前元素行坐标
           j: 当前元素列坐标
           num: 当前标记号
        */

        // 先将当前位置标记为已访问
        grid[i][j] = num;

        // 向右递归
        if (j + 1 < grid[0].size() && grid[i][j + 1] == '1')
        {
            numIslandsHelper(grid, i, j + 1, num);
        }

        // 向左递归
        if (j - 1 >= 0 && grid[i][j - 1] == '1')
        {
            numIslandsHelper(grid, i, j - 1, num);
        }

        // 向上递归
        if (i - 1 >= 0 && grid[i - 1][j] == '1')
        {
            numIslandsHelper(grid, i - 1, j, num);
        }

        // 向下递归
        if (i + 1 < grid.size() && grid[i + 1][j] == '1')
        {
            numIslandsHelper(grid, i + 1, j, num);
        }
        //cout<<"num=" << num<<endl;
    }

    int numIslands(vector<vector<char>>& grid) 
    {
        /* 主函数:计算岛屿数量 */
        /* 参数说明:
           grid: 二维字符数组,表示地图
        */

        char num = '2';  // 起始标记号
        int real_num = 0;  // 真实岛屿数量

        // 遍历地图元素
        for (int i = 0; i < grid.size(); i++)
        {
            for (int j = 0; j < grid[0].size(); j++)
            {
                if (grid[i][j] == '1')
                {
                    numIslandsHelper(grid, i, j, num);  // 调用帮助函数标记岛屿
                    real_num++;  // 岛屿数量加一
                }
            }
        }
        return real_num;  // 返回岛屿数量
    }
};

3N 皇后

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

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

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 9

思路:

首先来看一下皇后们的约束条件:

  1. 不能同行
  2. 不能同列
  3. 不能同斜线

确定完约束条件,来看看究竟要怎么去搜索皇后们的位置,其实搜索皇后的位置,可以抽象为一棵树。

只要搜索到了树的叶子节点,说明就找到了皇后们的合理位置了

回溯三部曲的具体应用在N皇后问题中可以分解如下:

  1. 递归函数参数

    • int n:棋盘大小,也即皇后数量
    • int row:当前处理的行数
    • vector<string>& chessBoard:当前棋盘状态
  2. 递归终止条件

    • row == n时,说明找到了一组解,将其加入结果集合并返回。
  3. 单层搜索的逻辑

    • 遍历当前行的每一列,尝试将皇后放置在该位置。
    • 调用isValid函数判断当前位置是否有效,即是否与之前的皇后位置产生冲突。
    • isValid函数的作用是判断当前位置是否有效,即判断放置皇后在当前位置是否会与之前已经放置的皇后位置产生冲突。具体而言,isValid函数可以通过以下方式来检查当前位置是否安全:

    • 检查同一列是否有皇后:遍历之前的每一行,检查当前列上是否已经放置了皇后,如果有则表示当前位置不安全。
    • 检查左对角线是否有皇后:遍历之前的每一行,检查当前位置的左对角线上是否存在皇后,即行号之差与列号之差的绝对值相等表示在同一左对角线上。
    • 检查右对角线是否有皇后:遍历之前的每一行,检查当前位置的右对角线上是否存在皇后,即行号之和与列号之差的绝对值相等表示在同一右对角线上。
    • 若有效,则在当前位置放置皇后,继续递归处理下一行。
    • 如果下一行无解,则回溯到当前位置,继续遍历下一个列。
    • 最终找到所有合法的解并存储到结果集中。

代码:

class Solution {
private:
    vector<vector<string>> result; // 存储最终结果的变量
    void backtracking(int n, int row, vector<string>& chessBoard) {
        // 回溯函数:用于解决N皇后问题
        // 参数说明:
        // n: 棋盘大小
        // row: 当前行数
        // chessBoard: 当前棋盘状态

        // 如果当前行数等于棋盘大小,说明找到了一组解,将其加入结果集合并返回
        if (row == n) {
            result.push_back(chessBoard);
            return;
        }

        // 遍历当前行的每一个列
        for (int col = 0; col < n; col++) {
            // 判断当前位置是否可以放置皇后
            if (isValid(row, col, chessBoard, n)) {
                // 如果可以放置皇后,则在当前位置放置一个皇后,继续对下一行进行递归
                chessBoard[row][col] = 'Q';
                backtracking(n, row + 1, chessBoard);
                // 回溯,将当前位置复原
                chessBoard[row][col] = '.';
            }
        }
    }

    bool isValid(int row, int col, vector<string>& chessBoard, int n) {
        // 判断当前位置是否可以放置皇后
        // 参数说明:
        // row: 当前行数
        // col: 当前列数
        // chessBoard: 当前棋盘状态
        // n: 棋盘大小

        // 遍历之前的行,判断是否同一列有皇后
        for (int i = 0; i < row; i++) {
            if (chessBoard[i][col] == 'Q') return false;
        }

        // 检查左上方对角线
        for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
            if (chessBoard[i][j] == 'Q') return false;
        }

        // 检查右上方对角线
        for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
            if (chessBoard[i][j] == 'Q') return false;
        }

        return true; // 可以放置皇后
    }

public:
    vector<vector<string>> solveNQueens(int n) {
        // 初始化一个n*n的棋盘,全部填充为'.'表示空格
        vector<string> chessBoard(n, string(n, '.'));
        // 从第0行开始回溯求解
        backtracking(n, 0, chessBoard);
        return result; // 返回所有解
    }
};

4最后一个能进入巴士的人

表: Queue

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| person_id   | int     |
| person_name | varchar |
| weight      | int     |
| turn        | int     |
+-------------+---------+
person_id 是这个表具有唯一值的列。
该表展示了所有候车乘客的信息。
表中 person_id 和 turn 列将包含从 1 到 n 的所有数字,其中 n 是表中的行数。
turn 决定了候车乘客上巴士的顺序,其中 turn=1 表示第一个上巴士,turn=n 表示最后一个上巴士。
weight 表示候车乘客的体重,以千克为单位。

有一队乘客在等着上巴士。然而,巴士有1000  千克 的重量限制,所以其中一部分乘客可能无法上巴士。

编写解决方案找出 最后一个 上巴士且不超过重量限制的乘客,并报告 person_name 。题目测试用例确保顺位第一的人可以上巴士且不会超重。

返回结果格式如下所示。

示例 1:

输入:
Queue 表
+-----------+-------------+--------+------+
| person_id | person_name | weight | turn |
+-----------+-------------+--------+------+
| 5         | Alice       | 250    | 1    |
| 4         | Bob         | 175    | 5    |
| 3         | Alex        | 350    | 2    |
| 6         | John Cena   | 400    | 3    |
| 1         | Winston     | 500    | 6    |
| 2         | Marie       | 200    | 4    |
+-----------+-------------+--------+------+
输出:
+-------------+
| person_name |
+-------------+
| John Cena   |
+-------------+
解释:
为了简化,Queue 表按 turn 列由小到大排序。
+------+----+-----------+--------+--------------+
| Turn | ID | Name      | Weight | Total Weight |
+------+----+-----------+--------+--------------+
| 1    | 5  | Alice     | 250    | 250          |
| 2    | 3  | Alex      | 350    | 600          |
| 3    | 6  | John Cena | 400    | 1000         | (最后一个上巴士)
| 4    | 2  | Marie     | 200    | 1200         | (无法上巴士)
| 5    | 4  | Bob       | 175    | ___          |
| 6    | 1  | Winston   | 500    | ___          |
+------+----+-----------+--------+-----

思路:我们需要根据 turn 排序, 并累加 weight,找到最后一个使得总和小于等于 1000 的 person_name

我们只需要计算出每个人进去后的总和,找到总和小于等于 1000 的最后一个人即可

代码:

select person_name
from(select *,
sum(weight) over (order by turn) as sum_weight
from Queue) a
where sum_weight<=1000
order by sum_weight desc
limit 1;

5 平均售价

表:Prices

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| start_date    | date    |
| end_date      | date    |
| price         | int     |
+---------------+---------+
(product_id,start_date,end_date) 是 prices 表的主键(具有唯一值的列的组合)。
prices 表的每一行表示的是某个产品在一段时期内的价格。
每个产品的对应时间段是不会重叠的,这也意味着同一个产品的价格时段不会出现交叉。

表:UnitsSold

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| purchase_date | date    |
| units         | int     |
+---------------+---------+
该表可能包含重复数据。
该表的每一行表示的是每种产品的出售日期,单位和产品 id。

编写解决方案以查找每种产品的平均售价。average_price 应该 四舍五入到小数点后两位

返回结果表 无顺序要求 。

结果格式如下例所示。

示例 1:

输入:
Prices table:
+------------+------------+------------+--------+
| product_id | start_date | end_date   | price  |
+------------+------------+------------+--------+
| 1          | 2019-02-17 | 2019-02-28 | 5      |
| 1          | 2019-03-01 | 2019-03-22 | 20     |
| 2          | 2019-02-01 | 2019-02-20 | 15     |
| 2          | 2019-02-21 | 2019-03-31 | 30     |
+------------+------------+------------+--------+
UnitsSold table:
+------------+---------------+-------+
| product_id | purchase_date | units |
+------------+---------------+-------+
| 1          | 2019-02-25    | 100   |
| 1          | 2019-03-01    | 15    |
| 2          | 2019-02-10    | 200   |
| 2          | 2019-03-22    | 30    |
+------------+---------------+-------+
输出:
+------------+---------------+
| product_id | average_price |
+------------+---------------+
| 1          | 6.96          |
| 2          | 16.96         |
+------------+---------------+
解释:
平均售价 = 产品总价 / 销售的产品数量。
产品 1 的平均售价 = ((100 * 5)+(15 * 20) )/ 115 = 6.96
产品 2 的平均售价 = ((200 * 15)+(30 * 30) )/ 230 = 16.96

思路:首先通过左连接将价格表和单位销售表按产品ID进行连接,然后根据条件筛选符合购买日期在有效日期范围内的数据。接着按产品ID分组统计数据,计算每个产品的平均价格,如果单位销售表中没有对应的数据,则平均价格为0,否则计算平均价格并四舍五入保留两位小数。最终得到每个产品的平均价格。

代码:

select
  prices.product_id, -- 选择价格表中的产品id
  ifnull(round(sum(price * units) / sum(units), 2), 0) as average_price -- 如果单位销售表中没有对应的数据,则平均价格为0;否则计算平均价格并四舍五入保留两位小数
from 
  prices 
left join unitssold 
  on prices.product_id = unitssold.product_id -- 使用产品id连接价格表和单位销售表
  and start_date <= purchase_date and purchase_date <= end_date -- 筛选符合购买日期在有效日期范围内的数据
group by product_id -- 按产品id分组统计数据

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

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

相关文章

科普童话新课堂杂志社科普童话新课堂编辑部2024年第16期目录

作品选 封2,封3-封4 探索新知《科普童话》投稿&#xff1a;cn7kantougao163.com 泱泱国之风 悠悠诗之情 沈灿宇1-3 试论"文化意识"视角下的高中英语阅读教学 董娜4-6 立足小组合作探究优化写作能力培养 时同祥7-9 以"导"促学:全面提升学生的文学核心素养 吴…

[网络安全] apt攻击是什么?

什么是APT攻击&#xff1a;APT攻击的主要特征包括&#xff1a;APT攻击的防御措施&#xff1a;零基础入门学习路线视频配套资料&国内外网安书籍、文档网络安全面试题 什么是APT攻击&#xff1a; APT&#xff08;Advanced Persistent Threat&#xff0c;高级持续性威胁&…

软件过程与项目管理期末复习

文章目录 1. 课程导论1) 什么是项目&#xff1f;具有什么特征&#xff1f;2) 项目管理的4阶段5过程的具体内容是什么&#xff1f;3) 项目管理的10大知识域是哪些&#xff1f;其中4个是核心知识域&#xff1f;4个核心知识域之间是什么关系&#xff1f;4) 什么是质量管理三角形&a…

汇舟问卷:做国外问卷调查需要准备些什么

大家好&#xff0c;我是汇舟问卷。海外问卷调查在这两年一直是个热门的项目&#xff0c;做这个项目所需要投入的成本是多少&#xff1f;如果我们要做这个项目需要准备什么以及要花多少钱&#xff1f;今天我来为大家讲解一下: 首先准备一台电脑 (内存建议16G&#xff0c;处理器…

C语言进阶:进阶指针(下)

一、 函数指针数组 我们都知道 数组是一个存放相同类型数据的存储空间 那我们已经学习了指针数组 那么函数有没有对应的指针数组呢&#xff1f; 如果有那应该怎么定义呢&#xff1f; 1. 函数指针数组的定义 我们说 函数指针数组的定义 应该遵循以下格式 int (*p[10])(); 首…

UniAD:以规划为导向的端到端自动驾驶

文章链接 这个文章是CVPR2023 Best Paper https://arxiv.org/pdf/2212.10156 提出背景 以往的自动驾驶多数是为不同的任务场景设计部署单独的模型&#xff0c;这样子组成的系统会很复杂如图a。 图b这是多任务共享一个主干&#xff0c;但还是要分离训练&#xff0c;而且不是…

03_Scala变量和数据类型

文章目录 [toc] **变量和数据类型****1.注释****2.变量和常量****3. 标识符的命名规范****4.scala的字符串****5.键盘输入****5.1 StdIn.readLine()****5.2 从文件中读取数据****5.3 Scala向外写数据** 变量和数据类型 1.注释 和Java完全一样 ** ** 2.变量和常量 var name…

外包干了4个月,技术退步明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

攻防世界 easyphp

本题主要利用的知识点是php绕过 一、PHP代码分析 首先先看一下代码 我们需要利用get方式上传3个参数a,b,c&#xff0c;这3个分别需要满足不同的条件: a&#xff1a;设置a值&#xff1b;值大于6000000&#xff1b;长度不超过3&#xff1b; b&#xff1a;设置b值&#xff1b;MD…

《QT实用小工具·三十五》基于PathView,Qt/QML做的一个可以无限滚动的日历控件

1、概述 源码放在文章末尾 改项目实现了基于PathView&#xff0c;Qt/QML做的一个可以无限滚动的日历控件&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; import QtQuick 2.7 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4Bu…

基于Spring Boot的口腔管理平台设计与实现

基于Spring Boot的口腔管理平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 管理员登录界面图&#xff0c;管理员登录进入口腔管理平…

Spring Cloud OpenFeign使用

OpenFeign源于Netflix的Feign&#xff0c;是http通信的客户端。屏蔽了网络通信的细节&#xff0c;直接面向接口的方式开发&#xff0c;让开发者感知不到网络通信细节。 所有远程调用&#xff0c;都像调用本地方法一样完成。 Spring Cloud OpenFeign 是 Spring Cloud 对 Feign …

Unity AssetsBundle打包

为什么要使用AssetsBundle包 减少安装包的大小 默认情况下&#xff0c;unity编译打包是对项目下的Assets文件夹全部内容进行压缩打包 那么按照这个原理&#xff0c;你的Assets文件夹的大小将会影响到你最终打包出的安装包的大小&#xff0c;假如你现在正在制作一个游戏项目&…

Aigtek:功率信号源是什么东西

功率信号源是一种电子设备&#xff0c;它可以提供可控的、稳定的高功率输出信号。通常用于测试和校准功率放大器、天线等设备&#xff0c;以及进行无线通信、雷达和卫星导航等应用中。下面将详细介绍功率信号源的概念、功能和特点。 功率信号源的概念 功率信号源是指能够产生可…

SCSS的基本使用(一)

目录 一、使用&符号来引用父选择器 二、scss的语法 三、变量&#xff08;Variables&#xff09; 四、嵌套&#xff08;Nesting&#xff09; 五、mixin 和 include 六、extend 继承 七、import 与 Partials 八、if简单判断 九、if复杂判断 一、使用&符号来引用父…

鸿蒙云函数调试坑点

如果你要本地调试请使用 const {payload, action} event.body/** 本地调试不需要序列化远程需要序列化 */ // const {payload, action} JSON.parse(event.body) const {payload, action} event.body 注意: 只要修改云函数&#xff0c;必须上传云函数 如果使用 const {pay…

【服务器部署篇】Jenkins配置后端工程自动化部署

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

【亲测对比】大厂云服务器2-64G对比表 不卡顿 幻兽帕鲁 我的世界 雾锁王国 饥荒联机版 英灵神殿通用

更新日期&#xff1a;4月26日&#xff08;京东云采购季持续进行&#xff09; 本文纯原创&#xff0c;侵权必究 《最新对比表》已更新在文章头部—腾讯云文档&#xff0c;文章具有时效性&#xff0c;请以腾讯文档为准&#xff01; 【腾讯文档实时更新】2024年-幻兽帕鲁服务器专…

C语言系列文章 | 初识C语言

首先分为几个方面来和各位读者介绍C语言&#xff0c;并在之后的学习过程中不断地和各位读者去分享我学习的经历。 坐好&#xff0c;发车咯~目录如下&#xff1a;1. C语言是什么&#xff1f;2. C语言的历史和辉煌3. 编译器的选择VS20224. VS项目和源⽂件、头⽂件介绍5. 第⼀…

关于java对接微信公众号(对接百度AI实现图片文字识别,对接聚合数据实现笑话、谜语大全,成语接龙等功能)

前言&#xff1a; 只是自己学习使用&#xff0c;所以有点不规范&#xff0c;请见谅 本文直接附上源码与效果图&#xff0c;具体操作步骤请参考另一篇文章&#xff1a;http://t.csdnimg.cn/PQu25 1.运行效果图 1.1 关注事件 1.2 笑话大全 1.3 谜语大全 1.3 多级菜单 1.4 按钮…