探索算法系列 - 双指针

目录

移动零(原题链接)

复写零(原题链接)

快乐数(原题链接)

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

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

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

三数之和(原题链接)

四数之和(原题链接)


移动零(原题链接)

给定一个数组 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++;elsedest += 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++;elseright--;}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++;elsereturn {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.xdnf.cn/news/1487944.html

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

相关文章

科研绘图系列:R语言组合堆积图(stacked barplot with multiple groups)

介绍 通常堆积图的X轴表示样本,样本可能会存在较多的分组信息,通过组合堆积图和样本标签分组信息,我们可以得到一张能展示更多信息的可发表图形。 加载R包 knitr::opts_chunk$set(warning = F, message = F) library(tidyverse) library(cowplot) library(patchwork)导入…

GDAL访问HDFS集群中的数据

1.集群搭建 参考文章&#xff1a;hadoop2.10.0完全分布式集群搭建 HA(QJM)高可用集群搭建_hadoop 2.10 ha-CSDN博客 创建文件夹 hdfs dfs -mkdir -p hdfs://192.168.80.132:9000/test 开放权限 hdfs dfs -chmod -R 777 /test 上传文件 hadoop fs -put /home/wh/data/res…

JavaScript(16)——定时器-间歇函数

开启定时器 setInterval(函数,间隔时间) 作用&#xff1a;每隔一段时间调用这个函数&#xff0c;时间单位是毫秒 例如&#xff1a;每一秒打印一个hello setInterval(function () { document.write(hello ) }, 1000) 注&#xff1a;如果是具名函数的话不能加小括号&#xf…

【论文复现】Vision Transformer(ViT)

1. Transformer结构 1.1 编码器和解码器 翻译这个过程需要中间体。也就是说&#xff0c;编码&#xff0c;解码之间需要一个中介&#xff0c;英文先编码成一个意思&#xff0c;再解码成中文。 那么查字典这个过程就是编码和解码的体现。首先我们的大脑会把它编码&#xff0c;编…

数仓架构解析(第45天)

系列文章目录 经典数仓架构传统离线大数据架构 文章目录 系列文章目录烂橙子-终生成长社群群主&#xff0c;前言1. 经典数仓架构2. 传统离线大数据架构 烂橙子-终生成长社群群主&#xff0c; 采取邀约模式&#xff0c;不支持付费进入。 前言 经典数仓架构 传统离线大数据架…

2000-2023年上市公司融资约束指数FC指数(含原始数据+计算结果)

2000-2023年上市公司融资约束指数FC指数&#xff08;含原始数据计算结果&#xff09; 1、时间&#xff1a;2000-2023年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a;证券代码、证券简称、统计截止日期、是否剔除ST或*ST或PT股、是否剔除上市不满一年、已经退市或被…

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

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

前端网页打开PC端本地的应用程序实现方案

最近开发有一个需求&#xff0c;网页端有个入口需要跳转三维大屏&#xff0c;而这个大屏是一个exe应用程序。产品需要点击这个入口&#xff0c;并打开这个应用程序。这个就类似于百度网盘网页跳转到PC端应用程序中。 这里我们采用添加自定义协议的方式打开该应用程序。一开始可…

前端:Vue学习 - 购物车项目

前端&#xff1a;Vue学习 - 购物车项目 1. json-server&#xff0c;生成后端接口2. 购物车项目 - 实现效果3. 参考代码 - Vuex 1. json-server&#xff0c;生成后端接口 全局安装json-server&#xff0c;json-server官网为&#xff1a;json-server npm install json-server -…

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配&#xff01;有了上次的内容铺垫&#xff0c;我们可以根据用户的token来判定&#xff0c;到底是显示什么内容了。 1&#xff1a;我们在对应的导航组件内修改完善一下内容即可。 <script setup> import { useUserSt…

深入理解TensorFlow底层架构

目录 深入理解TensorFlow底层架构 一、概述 二、TensorFlow核心概念 计算图 张量 三、TensorFlow架构组件 前端 后端 四、分布式计算 集群管理 并行计算 五、性能优化 内存管理 XLA编译 六、总结与展望 深入理解TensorFlow底层架构 一、概述 TensorFlow是一个开…

嵌入式C++、InfluxDB、Spark、MQTT协议、和Dash:树莓派集群物联网数据中心设计与实现(代码示例)

1. 项目概述 随着物联网技术的快速发展,如何高效地收集、存储和分析海量IoT设备数据成为一个重要课题。本文介绍了一个基于树莓派集群搭建的小型物联网数据中心,实现了从数据采集到分析可视化的完整流程。 该系统采用轻量级组件,适合资源受限的边缘计算环境。主要功能包括: …

分类常用的评价指标-二分类/多分类

二分类常用的性能度量指标 精确率、召回率、F1、TPR、FPR、AUC、PR曲线、ROC曲线、混淆矩阵 「精确率」查准率 PrecisionTP/(TPFP) 「召回率」查全率RecallTP/(TPFN) 「真正例率」即为正例被判断为正例的概率TPRTP/(TPFN) 「假正例率」即为反例被判断为正例的概率FPRFP/(TNFP)…

Java代码基础算法练习-数值求和-2024.07.25

任务描述&#xff1a; 现有一串字符(长度不超过255个字符)&#xff0c;需对其中的数值字符求和&#xff08;需转换成整型进行计算&#xff09;。 解决思路&#xff1a; 输入字符串&#xff0c;循环对每个字符否为数字&#xff0c;转换整型并求和 转换整型有以下的方式 1. su…

当 Nginx 出现请求的重复提交,如何处理?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 当 Nginx 出现请求的重复提交&#xff0c;如何处理&#xff1f;一、理解请求重复提交的来龙去脉二、请求重复提交可能带来的麻烦三、解决方案之“一夫当关”——…

文件包涵条件竞争(ctfshow82)

Web82 利用 session.upload_progress 包含文件漏洞 <!DOCTYPE html> <html> <body> <form action"https://09558c1b-9569-4abd-bf78-86c4a6cb6608.challenge.ctf.show//" method"POST" enctype"multipart/form-data"> …

【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常

问题现象 BeetISQL中间件版本&#xff1a;2.13.8.RELEASE 客户在调用BeetISQL提供的api向yashandb的表中执行batch insert并将返回sequence设置到传入的java bean时&#xff0c;报如下异常&#xff1a; 问题的风险及影响 影响业务流程正常执行&#xff0c;无法获得batch ins…

【BUG】已解决:IndexError: positional indexers are out-of-bounds

IndexError: positional indexers are out-of-bounds 目录 IndexError: positional indexers are out-of-bounds 【常见模块错误】 【解决方案】 原因分析 解决方法 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博…

HarmonyOS入门-状态管理

View(UI)&#xff1a;UI渲染&#xff0c;指将build方法内的UI描述和Builder装饰的方法内的UI描述映射到界面。 State&#xff1a;状态&#xff0c;指驱动UI更新的数据。用户通过触发组件的事件方法&#xff0c;改变状态数据。状态数据的改变&#xff0c;引起UI的重新渲染。 装…

2024权益商城系统网站源码

2024权益商城系统源码&#xff0c;支持多种支付方式&#xff0c;后台商品管理&#xff0c;订单管理&#xff0c;串货管理&#xff0c;分站管理&#xff0c;会员列表&#xff0c;分销日志&#xff0c;应用配置。 上传到服务器&#xff0c;修改数据库信息&#xff0c;导入数据库…