探索算法系列 - 双指针

news2024/9/22 11:24:32

目录

移动零(原题链接)

复写零(原题链接)

快乐数(原题链接)

盛最多水的容器(原题链接)

有效三角形的个数(原题链接)

查找总价格为目标值的两个商品(原题链接)

三数之和(原题链接)

四数之和(原题链接)


移动零(原题链接)

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

解题思路

  • 定义两个指针 cur 和 dest
  • cur 用于遍历整个数组。
  • dest 指向下一个非零元素应该放置的位置。
  • 初始化 dest 为 -1,这是因为我们需要在第一次找到非零元素时将其值赋给 dest 并且增加 dest 的值。

步骤说明

  1. 初始化

    • cur 从0开始。
    • dest 从-1开始(表示还没有遇到非零元素)。
  2. 遍历数组

    • 使用循环遍历整个数组 nums
    • 对于数组中的每一个元素 nums[cur],检查它是否是非零元素。
      • 如果 nums[cur] 不为0,则执行以下操作:
        • 将 dest 加1。
        • 交换 nums[dest] 和 nums[cur] 的值。
  3. 结束条件

    • 当 cur 遍历完整个数组后,循环结束。
  4. 结果

    • 所有的非零元素都已经被移动到了数组的前半部分,并保持了原有的顺序。
    • 所有的0元素都被移动到了数组的后半部分。

具体代码

class Solution 
{
public:
    void moveZeroes(vector<int>& nums)
    {
        for (int cur = 0, dest = -1; cur < nums.size(); cur++)
        {
            if (nums[cur])
            {
                swap(nums[++dest], nums[cur]);
            }
        }
    }
};

复写零(原题链接)

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

解题思路

  • 初始化变量

  • 预处理

  • 复制与调整

步骤说明

  1. 初始化

    • cur 从0开始。
    • dest 从-1开始。
    • n 是数组的长度。
  2. 预处理

    • 使用循环遍历整个数组 arr
    • 如果 arr[cur] 是0,则 dest 增加2;否则,dest 增加1。
    • 如果 dest 大于等于 n-1,则退出循环。
  3. 特殊情况处理

    • 如果 dest 等于 n,说明最后一个位置应该是一个复制的0元素,需要将最后一个元素设置为0,并减少 dest 的值以确保不会超出数组长度。
    • 减少 cur 的值以便在接下来的步骤中重新处理这个位置。
  4. 复制与调整

    • 从 cur 开始向左遍历数组。
    • 如果 arr[cur] 不为0,则直接将 arr[cur] 复制到 dest 的位置。
    • 如果 arr[cur] 为0,则需要复制两次0元素到 dest 的位置。
    • 在每一步之后减少 dest 的值,并且每次循环结束后减少 cur 的值。
  5. 结束条件

    • 当 cur 小于0 时,循环结束。

具体代码

class Solution
{
public:
    void duplicateZeros(vector<int>& arr)
    {
        int cur = 0, dest = -1, n = arr.size();
        while (cur < n)
        {
            if (arr[cur])
                dest++;
            else
                dest += 2;
            if (dest >= n - 1)
                break;
            cur++;
        }

        if (dest == n)
        {
            arr[n - 1] = 0;
            cur--;
            dest -= 2;
        }

        while (cur >= 0)
        {
            if (arr[cur])
                arr[dest--] = arr[cur--];
            else
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }
    }
};

快乐数(原题链接)

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

首先我们先证明:

        对于任意正整数,通过上述过程要么最终变为 1,要么进入一个循环,而不会出现其他情况。(鸽巢原理)

证明过程

  1. 有限性

    • 假设初始数为 𝑛n,且 𝑛n 有 𝑑d 位数字。
    • 每次迭代产生的新数的最大值是 𝑑×81d×81,这是因为每一位上的数字最大是 9,而 92=8192=81。
    • 因此,无论初始数有多大,经过若干次迭代后,得到的数将不会超过 𝑑×81d×81。
  2. 循环检测

    • 既然每次迭代产生的数都是有限集合内的一个数,那么随着迭代次数的增加,必然会出现重复的数。
    • 当重复出现时,就会形成一个循环,因为一旦出现了一个数,之后的迭代结果将完全由之前的数决定,形成一个闭环。
  3. 唯一循环

    • 如果一个数 𝑛n 通过上述过程变成了 1,那么它就是一个快乐数。
    • 如果一个数进入了循环,而循环中没有 1,那么这个数就是一个不快乐数。
    • 除了 1 之外,所有可能的循环都是有限的,因为生成的数总是有限集合内的一个数。

 解题思路

  • 定义辅助函数 bitSum:计算一个数各位数字的平方和。
  • 使用快慢指针法 isHappy:通过快慢指针法检测循环,判断是否为快乐数。

步骤说明

  1. 初始化变量 slow 和 fast
    • slow 初始化为 n
    • fast 初始化为 bitSum(n),即对 n 应用一次 bitSum 函数的结果。
  2. 使用快慢指针法检测循环
    • 在 slow 和 fast 不相等的情况下,继续执行循环。
    • 在每次循环中:
      • 更新 slow 为 bitSum(slow),即对 slow 应用一次 bitSum 函数。
      • 更新 fast 为 bitSum(bitSum(fast)),即对 fast 应用两次 bitSum 函数。
  3. 判断是否为快乐数
    • 如果 slow 和 fast 最终相等,并且等于 1,则 n 是快乐数。
    • 如果 slow 和 fast 最终相等但不等于 1,则 n 不是快乐数,因为它进入了循环。

具体代码

class Solution 
{
public:
    int bitSum(int n)
    {
        int sum = 0;
        while(n)
        {
            int t = n % 10;
            sum += t * t;
            n /= 10;
        }
        return sum;
    }

    bool isHappy(int n) 
    {
        int slow = n,fast = bitSum(n);
        while(slow != fast)
        {
            slow = bitSum(slow);
            fast = bitSum(bitSum(fast));
        }
        return slow == 1;
    }
};

盛最多水的容器(原题链接)

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

解题思路

  • 双指针法:使用两个指针 left 和 right,分别指向数组的起始位置和结束位置。
  • 计算面积:每次计算由 left 和 right 指向的两条线形成的容器面积。
  • 更新最大面积:记录每次计算的最大面积。
  • 移动指针:根据高度较小的一侧来移动指针,以寻找可能更大的面积。

步骤说明

  1. 初始化变量 left 和 right 分别指向数组的首尾,ret 用于记录最大的面积。
  2. 循环条件:当 left 小于 right 时,继续执行循环。
  3. 计算面积
    • 计算当前容器的面积 v,面积由较短边的高度和两线间的距离决定:v = min(height[left], height[right]) * (right - left)
    • 更新 ret 为当前面积 v 和已记录的最大面积 ret 中较大的那个值。
  4. 移动指针
    • 如果 height[left] 小于 height[right],则将 left 向右移动一位。
    • 否则,将 right 向左移动一位。
  5. 循环结束:当 left 不再小于 right 时,循环结束。
  6. 返回结果 ret

具体代码 

class Solution 
{
public:
    int maxArea(vector<int>& height) 
    {
        int left = 0, right = height.size() - 1, ret = 0;
        while(left < right)
        {
            int v = min(height[left], height[right]) * (right - left);
            ret = max(ret, v);

            if(height[left] < height[right])
                left++;
            else
                right--;
        }
        return ret;
    }
};

有效三角形的个数(原题链接)

给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。

解题思路

  • 排序:首先对数组进行排序。
  • 双指针法:使用两个指针 left 和 right,分别指向数组的起始位置和当前遍历位置的前一个位置。
  • 遍历:从数组的末尾开始遍历,每次选取一个数作为最长边。
  • 条件判断:根据构成三角形的条件,移动 left 和 right 指针来寻找所有可能的组合。

步骤说明

  1. 排序:

    • 使用 sort 函数对输入数组 nums 进行升序排序。
  2. 初始化变量:

    • ret 用于记录满足条件的组合数量。
    • n 是数组的长度。
  3. 遍历数组:

    • 从数组的末尾开始,即从最长的边开始遍历。
    • 使用循环变量 i 从 n - 1 开始递减到 2(因为至少需要三个数才能构成三角形)。
  4. 双指针法:

    • 在每次循环中,使用两个指针 left 和 right,分别初始化为 0 和 i - 1
    • 使用内部循环,当 left 小于 right 时,继续执行循环。
    • 根据构成三角形的条件(两边之和大于第三边),进行如下操作:
      • 如果 nums[left] + nums[right] > nums[i],则满足条件,此时所有位于 left 和 right 之间的数都可以与 nums[left] 和 nums[i] 构成三角形,因此加上 right - left 的数量。
      • 如果不满足条件,则将 left 向右移动一位,尝试更大的数。
      • 如果满足条件,则将 right 向左移动一位,尝试较小的数。
  5. 返回结果:

    • 返回 ret,即满足条件的组合数量。

具体代码 

class Solution 
{
public:
    int triangleNumber(vector<int>& nums) 
    {
        sort(nums.begin(), nums.end());

        int ret = 0, n = nums.size();
        for(int i = n - 1; i >= 2; i--)
        {
            int left = 0, right = i - 1;
            while(left < right)
            {
                if(nums[left] + nums[right] > nums[i])
                {
                    ret += right - left;
                    right--;
                }
                else
                {
                    left++;
                }
            }
        }
        return ret;
    }
};

查找总价格为目标值的两个商品(原题链接)

购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。

解题思路

  • 双指针法:使用两个指针 left 和 right,分别指向数组的起始位置和结束位置。
  • 计算和:每次计算由 left 和 right 指向的两个数的和。
  • 更新指针:根据和与目标值的关系来更新指针。
  • 返回结果:如果找到了符合条件的两个数,则返回这两个数;否则,返回 { -1, -1 }

步骤说明

  1. 初始化变量 left 和 right 分别指向数组的首尾。
  2. 循环条件:当 left 小于 right 时,继续执行循环。
  3. 计算和
    • 计算当前和 sumsum = price[left] + price[right]
  4. 更新指针
    • 如果 sum 大于 target,则将 right 向左移动一位。
    • 如果 sum 小于 target,则将 left 向右移动一位。
    • 如果 sum 等于 target,则找到了符合条件的两个数,返回这两个数。
  5. 循环结束:当 left 不再小于 right 时,循环结束。
  6. 返回结果:如果没有找到符合条件的两个数,则返回 { -1, -1 }

 具体代码

class Solution 
{
public:
    vector<int> twoSum(vector<int>& price, int target) 
    {
        int left = 0, right = price.size() - 1;
        while(left < right)
        {
            int sum = price[left] + price[right];
            if(sum > target)
                right--;
            else if(sum < target)
                left++;
            else
                return {price[left], price[right]};
        }
        return {-1,-1};
    }
};

三数之和(原题链接)

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

解题思路

  • 排序:首先对数组进行排序。
  • 双指针法:使用两个指针 left 和 right,分别指向数组的当前位置的后一个位置和数组的末尾。
  • 遍历:从数组的开头开始遍历,每次选取一个数作为第一个数。
  • 条件判断:根据和为 0 的条件,移动 left 和 right 指针来寻找所有可能的组合。
  • 去重:在遍历过程中,跳过重复的元素以避免重复的组合。

步骤说明

  1. 排序:

    • 使用 sort 函数对输入数组 nums 进行升序排序。
  2. 初始化变量:

    • ret 用于记录满足条件的组合。
    • n 是数组的长度。
  3. 遍历数组:

    • 从数组的开头开始遍历,使用循环变量 i
    • 当 nums[i] 大于 0 时,提前结束遍历(因为之后的组合肯定大于 0)。
  4. 双指针法:

    • 在每次循环中,使用两个指针 left 和 right,分别初始化为 i + 1 和 n - 1
    • 使用内部循环,当 left 小于 right 时,继续执行循环。
    • 计算和 sumsum = nums[left] + nums[right]
    • 根据和与目标值 0 的关系,进行如下操作:
      • 如果 sum 大于 0,则将 right 向左移动一位。
      • 如果 sum 小于 0,则将 left 向右移动一位。
      • 如果 sum 等于 0,则将当前组合加入到结果中,并移动指针以寻找下一个可能的组合。
      • 在找到有效的组合后,需要跳过重复的元素,以避免重复的组合。
  5. 返回结果:

    • 返回 ret,即满足条件的组合列表。

具体代码 

class Solution
{
public:
    vector<vector<int>> threeSum(vector<int>& nums)
    {
        vector<vector<int>> ret;

        sort(nums.begin(), nums.end());

        int n = nums.size();
        for (int i = 0; i < n; )
        {
            if (nums[i] > 0)
                break;
            int left = i + 1, right = n - 1, target = -nums[i];
            while (left < right)
            {
                int sum = nums[left] + nums[right];
                if (sum > target)
                    right--;
                else if (sum < target)
                    left++;
                else
                {
                    ret.push_back({ nums[i], nums[right], nums[left] });
                    left++, right--;
                    while (left < right && nums[left] == nums[left - 1])
                        left++;
                    while (left < right && nums[right] == nums[right + 1])
                        right--;
                }
            }
            i++;
            while (i < n && nums[i] == nums[i - 1])
                i++;
        }
        return ret;
    }
};

四数之和(原题链接)

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。

请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

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

 解题思路

  • 排序:首先对数组进行排序。
  • 双指针法:使用两个指针 left 和 right,分别指向数组的当前位置的后一个位置和数组的末尾。
  • 嵌套循环:使用两层嵌套循环,外层循环遍历数组中的两个数,内层使用双指针法寻找另外两个数,使得四数之和等于目标值。
  • 去重:在遍历过程中,跳过重复的元素以避免重复的组合。

步骤说明

  1. 排序:

    • 使用 sort 函数对输入数组 nums 进行升序排序。
  2. 初始化变量:

    • ret 用于记录满足条件的组合。
    • n 是数组的长度。
  3. 外层循环:

    • 从数组的开头开始遍历,使用循环变量 i
    • 内层循环遍历数组中的第二个数,使用循环变量 j
  4. 双指针法:

    • 在每次内外层循环中,使用两个指针 left 和 right,分别初始化为 j + 1 和 n - 1
    • 使用内部循环,当 left 小于 right 时,继续执行循环。
    • 计算和 sumsum = nums[left] + nums[right]
    • 根据和与目标值 target 的关系,进行如下操作:
      • 如果 sum 小于 target - nums[i] - nums[j],则将 left 向右移动一位。
      • 如果 sum 大于 target - nums[i] - nums[j],则将 right 向左移动一位。
      • 如果 sum 等于 target - nums[i] - nums[j],则将当前组合加入到结果中,并移动指针以寻找下一个可能的组合。
      • 在找到有效的组合后,需要跳过重复的元素,以避免重复的组合。
  5. 返回结果:

    • 返回 ret,即满足条件的组合列表。

具体代码 

class Solution 
{
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) 
    {
        vector<vector<int>> ret;

        sort(nums.begin(), nums.end());
        
        int n = nums.size();
        for(int i = 0; i < n; )
        {
            for(int j = i + 1; j < n; )
            {
                int  left = j + 1, right = n - 1;
                long long aim = (long long)target - nums[i] - nums[j];
                while(left < right)
                {
                    int sum = nums[left] + nums[right];
                    if(sum < aim)
                        left++;
                    else if(sum > aim)
                        right--;
                    else
                    {
                        ret.push_back({nums[i], nums[j], nums[left], nums[right]});
                        left++, right--;
                        while (left < right && nums[left] == nums[left - 1])
                            left++;
                        while (left < right && nums[right] == nums[right + 1])
                            right--;
                    }
                }
                j++;
                while(j < n && nums[j] == nums[j-1])
                    j++;
            }
            i++;
            while(i < n && nums[i] == nums[i - 1])
                i++;
        }
        return ret;
    }
};

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

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

相关文章

鸿蒙开发—黑马云音乐之广告页

目录 1.页面布局 2.点击按钮跳转 3.倒计时自动跳转 接下来是项目实战&#xff0c;项目选用传智的黑马云音乐。 效果图如下&#xff1a; 1.页面布局 Entry Component struct ADPage {State message: string Hello Worldbuild() {Stack({alignContent:Alignment.TopEnd}) {…

Axure中继器实战篇:让数据展示和交互设计更上一层楼!

Axure中继器实战篇:让数据展示和交互设计更上一层楼! 前言 经过了前两章的学习,接下来我们去模拟的实际场景开启实战篇,以下是界面 1.前期准备 前期把页面准备好后,给中继器的每个单元格命名为了方便数据绑定的操作。 为了演示我准备了几十行数据,建议也多准备一点。…

学习Java的日子 Day56 数据库连接池,Druid连接池

Day56 1.数据库连接池 理解&#xff1a;池就是容器&#xff0c;容器中存放了多个连接对象 使用原因&#xff1a; 1.优化创建和销毁连接的时间&#xff08;在项目启动时创建连接池&#xff0c;项目销毁时关闭连接池&#xff09; 2.提高连接对象的复用率 3.有效控制项目中连接的…

vue 搜索框

效果 创建搜索组件&#xff1a; 在Vue项目中&#xff0c;首先需要创建一个搜索组件。这个组件通常包含一个输入框和一个搜索按钮。使用v-model指令将输入框与组件的数据属性&#xff08;如searchKeyword&#xff09;进行双向绑定&#xff0c;以便获取用户输入的关键词。处理搜索…

Linus: vim编辑器的使用,快捷键及配置等周边知识详解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 vim的安装创建新用户 adduser 用户名Linus是个多用户的操作系统是否有创建用户的权限查看当前用户身份:whoami** 怎么创建设置密码passwdsudo提权(sudo输入的是用户…

锁相环 vivado FPGA

原理 同步状态/跟踪状态&#xff1a;相位差在2kπ附近&#xff0c;频率差为0到达上述状态的过程称为捕获过程锁相环的捕获带&#xff1a;delta w的最大值&#xff0c;大于这个值的话就不能捕获鉴相器&#xff08;PD-phase discriminator&#xff09;&#xff1a;相乘加LPF&…

从0到1使用Docker部署java项目详解

Docker部署Java项目相比传统部署方式&#xff0c;在环境一致性、配置管理、可扩展性和安全性等方面具有显著优势。然而&#xff0c;它也带来了学习成本、资源消耗和复杂度增加等挑战。 云服务器 白嫖阿里云服务 通过免费试用方式获取自己的阿里云服务器。当然&#xff0c;如…

SQL-REGEX-常见正则表达式的使用

SQL-REGEX-常见正则表达式的使用 在SQL中&#xff0c;正则表达式&#xff08;Regex&#xff09;的使用可以帮助进行更灵活和精确的模式匹配和数据筛选。不同的数据库管理系统对于正则表达式的支持略有差异&#xff0c;但大体都是相似的。 Tips&#xff1a; 模式描述匹配内容…

优选算法之前缀和(上)

目录 一、【模板】一维前缀和 1.题目链接&#xff1a;DP34【模板】前缀和 2.题目描述&#xff1a; 3.解法&#xff08;前缀和&#xff09; &#x1f343;算法思路&#xff1a; &#x1f343;算法代码&#xff1a; 二、【模板】二维前缀和 1.题目链接&#xff1a;DP35【…

海外短剧CPS分销推广系统平台源码搭建方案介绍

随着全球内容消费市场的日益繁荣&#xff0c;短剧作为一种新兴的娱乐形式&#xff0c;正在迅速赢得全球观众的喜爱。特别是当国内短剧以其独特的创意和精湛的制作技艺&#xff0c;吸引了大量海外观众的关注时&#xff0c;短剧出海成为了国内影视行业的一大趋势。接下来为大家介…

HarmonyOS三方库的使用

系统组件难以提供比较优秀的界面&#xff0c;需要第三方库来实现一些比较好看的界面效果 三方库的获取&#xff1a; 开源社区支持OpenHarmony-TPC 和 Openharmony三方库中心仓 先目前已经拥有各种各样的三方库&#xff0c;包括UI 图片 动画 网络 数据存储 工具类 多媒体 安全等…

Cookie与Session 实现登录操作

Cookie Cookie 是网络编程中使用最广泛的一项技术&#xff0c;主要用于辨识用户身份。 客户端&#xff08;浏览器&#xff09;与网站服务端通讯的过程如下图所示&#xff1a; 从图中看&#xff0c;服务端既要返回 Cookie 给客户端&#xff0c;也要读取客户端提交的 Cookie。所…

Android开发中使用Base64类库进行密码加密报错解决

在对密码加密采用sdk自带类库Base64加密时&#xff0c;函数可跳转&#xff0c;能够索引到类函数位置&#xff0c;但是运行出现报错。 使用情况&#xff1a; 引用&#xff1a;import java.util.Base64; 调用&#xff1a;String decode new String(Base64.getEncoder().encod…

实战练习之Linux上实现shell脚本自动化编程

实验拓扑要求 主机环境描述 注意&#xff1a; 172.25.250.101-172.25.250.105 共 5 个 IP 地址由servera.exam.com服务器进行提供。172.25.250.106 由 serverb.exam.com 服务器进行提供。 需求描述 1. 172.25.250.101 主机上的 Web 服务要求提供 www.exam.com Web站点&#…

模拟ADG主库归档文件丢失,备库出现gap(增量备份解决)

文章目录 一、说明二、环境信息2.1.主备库环境信息2.2.检查主备是否同步正常 三、模拟日志断档3.1.模拟主库归档文件丢失3.2 查看主库状态出现GAP 四、RMAN增量备份恢复备库同步4.1 RMAN增量恢复备库4.2 开启备库redo同步4.3 主备库验证同步 一、说明 模拟Oracle主库归档文件丢…

C++图书管理系统

目录 实现功能 用户管理 图书管理 借阅与归还 未归还图书 部分效果图 结构体 Book 结构体 User 结构体 源代码 编译时在连接器命令行加入 完整代码 实现功能 用户管理 添加用户&#xff1a;输入用户ID、用户名和密码…

简单的git分支mergepush权限设定

简单的git分支merge&push权限设定 1. 需求 公司的分支很多&#xff0c;主要的有master分支&#xff0c;很多的业务需求分支&#xff0c;开发测试分支(uat,uat2,sit,sit2)&#xff0c;这些分支当前是谁都可以进行提交&#xff0c;但是如果在分支上直接修改&#xff0c;或者…

3.1、数据结构-线性表

数据结构 数据结构线性结构线性表顺序存储和链式存储区别单链表的插入和删除练习题 栈和队列练习题 串&#xff08;了解&#xff09; 数据结构 数据结构该章节非常重要&#xff0c;上午每年都会考10-12分选择题下午一个大题 什么叫数据结构&#xff1f;我们首先来理解一下什…

如何查找下载安装安卓APK历史版本?

在安卓设备上&#xff0c;有时候我们可能希望安装某个软件的旧版本&#xff0c;可能是因为新版本不兼容、功能改变不符合需求或是其他原因。 安卓系统并不像iOS那样提供直观的历史版本下载界面。 不过&#xff0c;通过一些第三方市场和网站&#xff0c;我们仍然可以找到并安装…

通信原理实验六:实验测验

实验六 实验测验 一&#xff1a;测验内容和要求 测试需要完成以下几个步骤&#xff1a; 配置好以下网络图&#xff1b;占总分10%&#xff08;缺少一个扣一分&#xff09;根据下面图配置好对应的IP和网关以及路由等相关配置&#xff0c;保证设备之间连通正常&#xff1b;占总…