怒刷LeetCode的第10天(Java版)

目录

第一题

题目来源

题目内容

解决方法

方法一:两次拓扑排序

第二题

题目来源

题目内容

解决方法

方法一:分治法

方法二:优先队列(Priority Queue)

方法三:迭代

第三题

题目来源

题目内容

解决方法

方法一:迭代

方法二:递归

方法三:双指针

方法四:栈


第一题

题目来源

2603. 收集树中金币 - 力扣(LeetCode)

题目内容

解决方法

方法一:两次拓扑排序

这个解法的思路如下:

  1. 首先,初始化一个邻接表 g,用于存储树的结构,以及一个数组 degree,用于记录每个节点的度数。
  2. 遍历边的数组 edges,将每条边的两个节点之间建立连接关系,并更新节点的度数。
  3. 初始化一个队列 queue,用于存储无金币的叶子节点。
  4. 遍历所有节点,如果一个节点的度数为1并且该节点没有金币,则将其加入队列。
  5. 开始循环,直到队列为空。在每次迭代中,取出队列的首个节点 u。
  6. 将节点 u 的度数减1,剩余节点数 rest 减1。
  7. 遍历与节点 u 相邻的所有节点 v,将其度数减1。
  8. 如果节点 v 的度数为1并且该节点没有金币,则将其加入队列。
  9. 重复步骤 5-8,直到队列为空。
  10. 重复两次以下步骤(总共遍历两次): a. 初始化一个新的队列 queue。 b. 遍历所有节点,将度数为1的节点加入队列。 c. 开始循环,直到队列为空。 d. 取出队列的首个节点 u,将其度数减1,剩余节点数 rest 减1。 e. 遍历与节点 u 相邻的所有节点 v,将其度数减1。 f. 重复步骤 d-e,直到队列为空。
  11. 返回结果,如果剩余节点数 rest 为0,则路径长度为0;否则,路径长度为 (rest - 1) * 2。

这样,通过删除树中无金币的叶子节点和维护节点的度数,可以得到最小路径长度。

class Solution {public int collectTheCoins(int[] coins, int[][] edges) {int n = coins.length;List<Integer>[] g = new List[n];for (int i = 0; i < n; ++i) {g[i] = new ArrayList<Integer>();}int[] degree = new int[n];for (int[] edge : edges) {int x = edge[0], y = edge[1];g[x].add(y);g[y].add(x);++degree[x];++degree[y];}int rest = n;/* 删除树中所有无金币的叶子节点,直到树中所有的叶子节点都是含有金币的 */Queue<Integer> queue = new ArrayDeque<Integer>();for (int i = 0; i < n; ++i) {if (degree[i] == 1 && coins[i] == 0) {queue.offer(i);}}while (!queue.isEmpty()) {int u = queue.poll();--degree[u];--rest;for (int v : g[u]) {--degree[v];if (degree[v] == 1 && coins[v] == 0) {queue.offer(v);}}}/* 删除树中所有的叶子节点, 连续删除2次 */for (int x = 0; x < 2; ++x) {queue = new ArrayDeque<Integer>();for (int i = 0; i < n; ++i) {if (degree[i] == 1) {queue.offer(i);}}while (!queue.isEmpty()) {int u = queue.poll();--degree[u];--rest;for (int v : g[u]) {--degree[v];}}}return rest == 0 ? 0 : (rest - 1) * 2;}
}

复杂度分析:

1、构建邻接表和计算节点度数的复杂度:

  • 遍历边的数组 edges,时间复杂度为 O(m),其中 m 是边的数量。
  • 初始化邻接表 g 的空间复杂度为 O(n),其中 n 是节点的数量。
  • 更新节点度数的过程需要遍历所有边,时间复杂度为 O(m)。

2、删除无金币叶子节点的过程的复杂度:

  • 初始化队列的时间复杂度为 O(n),其中 n 是节点的数量。
  • 每个节点最多被处理一次,因此删除过程的时间复杂度为 O(n)。

3、连续删除两次叶子节点的过程的复杂度:

  • 需要进行两次完整的节点遍历,因此时间复杂度为 O(2n) = O(n),其中 n 是节点的数量。

综上所述,整个解法的时间复杂度为 O(m + n),其中 m 是边的数量,n 是节点的数量。空间复杂度为 O(n),用于存储邻接表和节点度数。

LeetCode运行结果:

第二题

题目来源

23. 合并 K 个升序链表 - 力扣(LeetCode)

题目内容

解决方法

方法一:分治法

这是一个合并K个升序链表的问题,可以使用分治法来解决。使用了分治法来将k个链表分成两部分进行合并,然后再将合并后的结果继续与剩下的链表合并,直到最终合并成一个升序链表。在每个合并的过程中,可以使用双指针来逐个比较两个链表的节点值,将较小的节点连接到结果链表上。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
public class Solution {public ListNode mergeKLists(ListNode[] lists) {if (lists == null || lists.length == 0) {return null;}return merge(lists, 0, lists.length - 1);}private ListNode merge(ListNode[] lists, int start, int end) {if (start == end) {return lists[start];}int mid = start + (end - start) / 2;ListNode left = merge(lists, start, mid);ListNode right = merge(lists, mid + 1, end);return mergeTwoLists(left, right);}private ListNode mergeTwoLists(ListNode l1, ListNode l2) {if (l1 == null) {return l2;}if (l2 == null) {return l1;}if (l1.val < l2.val) {l1.next = mergeTwoLists(l1.next, l2);return l1;} else {l2.next = mergeTwoLists(l1, l2.next);return l2;}}
}

复杂度分析:

  • 这个解法的时间复杂度是 O(Nlogk),其中 N 是所有链表的节点总数,k 是链表的数量。因为在每层合并的过程中,需要遍历 N 个节点来比较值,并且每次合并的链表数量减半,因此总共需要合并 logk 层。所以时间复杂度是 O(Nlogk)。
  • 空间复杂度是 O(logk),主要是递归调用栈的空间。在每一层递归中,都会创建两个新的递归函数调用,所以递归的层数最多是 logk。因此,空间复杂度是 O(logk)。

需要注意的是,这里的空间复杂度是指除了返回的合并后的链表之外的额外空间使用量。

LeetCode运行结果:

方法二:优先队列(Priority Queue)

使用了优先队列来维护当前k个链表中的最小节点。首先,将所有链表的头节点加入到优先队列中。然后,不断从优先队列中取出最小的节点,将其加入到合并后的链表中,并将该节点的下一个节点加入到队列中。重复这个过程直到队列为空。 

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
public class Solution {public ListNode mergeKLists(ListNode[] lists) {if (lists == null || lists.length == 0) {return null;}// 创建一个优先队列,按照节点值的大小进行排序PriorityQueue<ListNode> queue = new PriorityQueue<>((a, b) -> a.val - b.val);// 将所有链表的头节点加入到优先队列中for (ListNode node : lists) {if (node != null) {queue.offer(node);}}// 创建一个dummy节点作为合并后的链表头部ListNode dummy = new ListNode(0);ListNode curr = dummy;// 不断从优先队列中取出最小的节点,将其加入到合并后的链表中,然后将该节点的下一个节点加入到队列中while (!queue.isEmpty()) {ListNode node = queue.poll();curr.next = node;curr = curr.next;if (node.next != null) {queue.offer(node.next);}}return dummy.next;}
}

复杂度分析:

  • 这个基于优先队列的解法的时间复杂度是O(Nlogk),其中N是所有链表的节点总数,k是链表的数量。主要的时间消耗在于构建优先队列和从队列中取出最小节点,而构建优先队列的时间复杂度是O(klogk),每次取出最小节点的操作时间复杂度是O(logk)。由于总共需要取出N个节点,因此总体的时间复杂度是O(Nlogk)。
  • 空间复杂度是O(k),主要是优先队列所占用的空间。在最坏情况下,优先队列中最多会有k个节点,因此空间复杂度是O(k)。

需要注意的是,这里的空间复杂度是指除了返回的合并后的链表之外的额外空间使用量。

LeetCode运行结果:

方法三:迭代

使用了迭代的方式逐一合并链表。

  1. 首先设定一个变量 interval,初始值为1,表示每次合并的链表数量。
  2. 然后进行循环,直到 interval 大于等于链表数组的长度。在每次循环中,按照 interval 的步长对链表数组进行逐一合并。每次合并两个链表,将合并结果放回原始数组的相应位置。
  3. 通过每次将 interval 值翻倍,循环进行迭代合并,直到 interval 大于等于链表数组的长度,最终得到合并后的链表。
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode mergeKLists(ListNode[] lists) {if (lists == null || lists.length == 0) {return null;}int interval = 1;while (interval < lists.length) {for (int i = 0; i + interval < lists.length; i += 2 * interval) {lists[i] = mergeTwoLists(lists[i], lists[i + interval]);}interval *= 2;}return lists[0];}private ListNode mergeTwoLists(ListNode l1, ListNode l2) {ListNode dummy = new ListNode(0);ListNode curr = dummy;while (l1 != null && l2 != null) {if (l1.val < l2.val) {curr.next = l1;l1 = l1.next;} else {curr.next = l2;l2 = l2.next;}curr = curr.next;}if (l1 != null) {curr.next = l1;}if (l2 != null) {curr.next = l2;}return dummy.next;}
}

复杂度分析:

  • 时间复杂度:这个解法的时间复杂度是O(Nklogk),其中N是每个链表的平均长度,k是链表的数量。通过每次将 interval 值翻倍,循环进行迭代合并,直到 interval 大于等于链表数组的长度,最终得到合并后的链表。在每一层循环中的操作总时间复杂度仍然是O(Nk),因为每一层的合并操作需要遍历所有链表节点。
  • 空间复杂度:这个解法的空间复杂度是O(1),没有使用额外的数据结构。只需要常数级别的额外空间来保存临时变量。

综上所述,优先队列解法和分治法解法的时间复杂度相同,但优先队列解法的空间复杂度略高于分治法解法。而迭代解法的时间复杂度稍高于前两种解法,并且空间复杂度较低。

LeetCode运行结果:

第三题

题目来源

24. 两两交换链表中的节点 - 力扣(LeetCode)

题目内容

解决方法

方法一:迭代

迭代的思路是遍历链表,每次处理两个相邻节点进行交换。具体步骤如下:

1、定义一个哑节点(dummy)作为新链表的头节点,并将其指向原始链表的头节点head。

2、定义一个指针prev指向哑节点,用于连接新链表中的节点。

3、当原始链表中至少有两个节点时,重复以下操作:

  • 使用指针curr1指向当前要交换的第一个节点,即prev.next。
  • 使用指针curr2指向当前要交换的第二个节点,即curr1.next。
  • 将prev的下一个节点指向curr2,完成节点交换。
  • 将curr1的下一个节点指向curr2的下一个节点,完成节点交换。
  • 将curr2的下一个节点指向curr1,完成节点交换。
  • 更新prev指针和curr1指针,使它们分别指向交换后的第二个节点和下一组要交换的第一个节点。

4、返回哑节点(dummy)的下一个节点作为新链表的头节点。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {
public ListNode swapPairs(ListNode head) {ListNode dummy = new ListNode(0);dummy.next = head;ListNode prev = dummy;while (head != null && head.next != null) {ListNode curr1 = head;ListNode curr2 = head.next;prev.next = curr2;curr1.next = curr2.next;curr2.next = curr1;prev = curr1;head = curr1.next;}return dummy.next;
}}

复杂度分析:

  • 时间复杂度:O(n),其中n是链表中的节点数。需要遍历链表中的每个节点一次。
  • 空间复杂度:O(1)。只需要常数级别的额外空间。

LeetCode运行结果:

方法二:递归

递归的思路是将链表分成两部分:第一个节点和剩余节点。然后,交换这两部分,并递归地对剩余节点进行两两交换。具体步骤如下:

  1. 当链表为空或只有一个节点时,无需交换,直接返回该节点。
  2. 令first指向链表的头节点,second指向first的下一个节点。
  3. 交换first和second节点,即将second的next指向first,并将first的next指向递归处理剩余节点的结果。
  4. 返回second节点作为新链表的头节点。
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {
public ListNode swapPairs(ListNode head) {if (head == null || head.next == null) {return head;}ListNode first = head;ListNode second = head.next;first.next = swapPairs(second.next);second.next = first;return second;
}
}

复杂度分析:

  • 时间复杂度:O(n),其中n是链表中的节点数。每次递归都会处理一个节点,并且递归调用的层数最多为n/2。
  • 空间复杂度:O(n),其中n是链表中的节点数。递归调用的栈空间最多为n/2。

LeetCode运行结果:

方法三:双指针

除了递归和迭代之外,还可以使用双指针的方法来交换链表中的节点。该方法使用两个指针prev和curr分别指向当前要交换的两个节点的前一个节点和第一个节点。通过不断地交换节点,并更新指针,实现链表中节点的两两交换。

注意:它与迭代方法的思路类似,但在细节上有所改动。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {
public ListNode swapPairs(ListNode head) {// 创建哑节点(dummy)作为新链表的头节点,并将其指向原始链表的头节点headListNode dummy = new ListNode(0);dummy.next = head;// 定义两个指针prev和curr,分别指向当前要交换的两个节点的前一个节点和第一个节点ListNode prev = dummy;ListNode curr = head;while (curr != null && curr.next != null) {// 获取要交换的两个节点ListNode node1 = curr;ListNode node2 = curr.next;// 进行节点交换prev.next = node2;node1.next = node2.next;node2.next = node1;// 更新prev和curr指针,进行下一组节点交换prev = node1;curr = node1.next;}return dummy.next;
}}

复杂度分析:

  • 时间复杂度:O(n)  遍历链表中的每个节点一次,所以时间复杂度是线性的。
  • 空间复杂度:O(1)  只使用了常数级别的额外空间,不随输入规模增加而变化。

LeetCode运行结果:

方法四:栈

除了递归、双指针和迭代之外,还可以使用栈来实现链表节点的两两交换。

这种栈的方法将链表中的节点依次入栈,每次栈中至少有两个节点时,就进行交换操作。通过维护栈来实现链表节点的两两交换。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {
public ListNode swapPairs(ListNode head) {// 创建一个栈Deque<ListNode> stack = new ArrayDeque<>();ListNode dummy = new ListNode(0);dummy.next = head;ListNode curr = dummy;while (curr != null && curr.next != null) {// 将当前节点的后继节点和后继的后继节点入栈stack.push(curr.next);stack.push(curr.next.next);// 当栈中至少有两个节点时,进行节点交换if (stack.size() >= 2) {curr.next = stack.pop();curr.next.next = stack.pop();curr = curr.next.next;} else {break;}}return dummy.next;
}}

复杂度分析:

  • 时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表中的每个节点一次。
  • 空间复杂度:O(n),需要使用一个栈来存储节点。

需要注意的是,递归的深度与链表的长度相关,当链表较长时可能会导致栈溢出,因此在实际使用时需要注意链表的长度限制。如果链表长度较大,建议使用其他方法实现节点的交换。

LeetCode运行结果:

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

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

相关文章

【Vue】ElementUI实现登录注册

目录 一.跨域的概述 1.1.概述 1.2.特点 二.ElementUI 2.1. 导入 2.2.搭建 2.3.页面 三.数据交互 3.1.安装相关模块 3.1.1安装模块 3.1.2查看模块 3.1.3.引用模块 3.2. axios的get请求 3.3. axios的post请求 四.注册功能 好啦今天到这了&#xff0c;希望能帮到你&…

Matplotlib 是一个广泛用于 Python 数据可视化的库

Matplotlib 是一个广泛用于 Python 数据可视化的库&#xff0c;它提供了丰富的绘图功能&#xff0c;允许用户创建各种类型的图表&#xff0c;从简单的折线图到复杂的三维图表&#xff0c;以及定制图形的各个方面。以下是Matplotlib的一些重要特点和常见用法&#xff1a; Matpl…

向量数据库库Milvus Cloud2.3 技术选型中性能、成本、扩展性是重点

技术选型中性能、成本、扩展性是重点 对于向量数据库来说,用户最关心的莫过于性能、成本和扩展性。 Milvus 2.x 从 Day 1 开始就将扩展性作为设计的第一优先级,在众多用户环境中落地了十亿至百亿级别场景。不止如此,对于 Milvus 来说,扩展性不仅仅意味着支持百亿级别向量,…

网站整站优化-网站整站优化工具

您是否曾为您的网站在搜索引擎中的排名而感到焦虑&#xff1f;是否苦苦思考如何提高流量、吸引更多用户&#xff1f; 什么是整站优化。简而言之&#xff0c;它是一项用于提升网站在搜索引擎中排名的策略和技巧。通过对网站的内容、结构、速度等方面进行优化&#xff0c;可以使…

wordpress使用category order and taxonomy terms order插件实现分类目录的拖拽排序

文章目录 引入实现效果安装插件使用插件 引入 使用docker快速搭建wordpress服务&#xff0c;并指定域名访问 上一节我们使用docker快速搭建了wordpress服务&#xff0c;可以看到基础的wordpress服务已经集成基础的用户管理、文章发布、页面编辑、文章分类等功能&#xff0c;但…

当下IT测试技术员的求职困境

从去年被裁到现在&#xff0c;自由职业的我已经有一年没有按部就班打卡上班了。期间也面试了一些岗位&#xff0c;有首轮就挂的&#xff0c;也有顺利到谈薪阶段最后拿了offer的&#xff0c;不过最后选择了拒绝。 基于自己近一年的面试求职经历&#xff0c;我想聊聊当下大家在求…

时序数据库 IoTDB 发布端边云原生解决方案,有效优化工业互联网数据上传时效与资源消耗...

2023 年 9 月 8 日&#xff0c;由中国通信学会、福建省工业和信息化厅主办的 2023 中国国际工业互联网创新发展大会在厦门举办。大会主论坛中&#xff0c;时序数据库 IoTDB 发表其自研建立的端边云原生解决方案&#xff0c;该方案可实现端侧设备、边缘服务器、数据中心数据的协…

安卓备份基带分区 备份字库 步骤解析 以免误檫除分区或者“格机” 后悔莫及

玩机搞机---安卓机型mtk和高通芯片查看分区 导出分区 备份分区的一些工具分析 修复基带 改串码 基带qcn 改相关参数 格机危害 手机基带的重要性前面几期博文我都有相关的说明。他区别于别的分区。而且目前手机的安全性越来越高。基带分区基本都是专机专用。而不像早期机型一…

代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II

本文思路和详细解答来源于: 代码随想录 视频讲解见: 双指针法经典题目 | LeetCode&#xff1a;977.有序数组的平方_哔哩哔哩_bilibili Leetcode T977 有序数组的平方 题目链接: 977. 有序数组的平方 - 力扣&#xff08;LeetCode&#xff09; 思路1: 暴力求解 这里先解释一下非…

图像相关名词概述

颜色模式 通过赋予C的不同维度不同的含义&#xff0c;可以用来描述不同的颜色空间。颜色模式&#xff0c;是将某种颜色表现为数字形式的模型&#xff0c;或者说是一种记录图像颜色的方式。本单元主要讲述两个常用的颜色模式&#xff1a;RGB&#xff0c;HSV。 RGB模式是工业界的…

为什么atomic不是线程安全的

原理 1、读取i的值存入寄存器&#xff1b; 2、将i加1&#xff1b; 3、修改i的值&#xff1b; 修改一个属性包含了读&#xff0c;执行 改变&#xff0c;写入&#xff0c;atomic 只为读和写加了锁&#xff0c;保证了同一个时间只有一个线程在读和写&#xff0c;但是&#xff0c;会…

开关电源-交流220V降压电路-电阻电容降压原理

阻容降压原理 电容电阻降压的原理其实比较简单。它的工作原理是电容在交流信号的情况下&#xff0c;产生容抗来限制最大的工作电流。说白了就是电容使用它自己的通交流阻直流的性能&#xff0c;在交流信号输入时电容产生容抗。我们通过他的这个特性&#xff0c;可以设计出&…

2614. 对角线上的质数-c语言解法

给你一个下标从 0 开始的二维整数数组 nums 。 返回位于 nums 至少一条 对角线 上的最大 质数 。如果任一对角线上均不存在质数&#xff0c;返回 0 。 注意&#xff1a; 如果某个整数大于 1 &#xff0c;且不存在除 1 和自身之外的正整数因子&#xff0c;则认为该整数是一个…

【Windows】 Windows 10 等系统如何关闭文件夹预览模式

在Windows系统进行文件操作时&#xff0c;由于屏幕尺寸有限&#xff0c;有时感觉文件夹右侧的预览模式很占位置&#xff0c;因此想预览时打开&#xff0c;想关闭时就关闭。 以下是两种解决方案&#xff1a; 方案一&#xff1a;彻底关闭预览模式 方案二&#xff1a;可通过快捷键…

“源启2.0”:从自上而下的解构,到自下而上的重构

从垂直打穿、到应用重构&#xff0c;中电金信赋能行业数字化转型之路既“向下走”、也“向上看”。“向上”先理解和吃透客户的企业战略&#xff0c;进而自上而下地将企业战略拆解为业务架构&#xff0c;“向下”再将业务架构拆解为应用架构和数据架构&#xff0c;并进一步对齐…

18795-2012 茶叶标准样品制备技术条件

声明 本文是学习GB-T 18795-2012 茶叶标准样品制备技术条件. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了各类茶叶(除再加工茶)标准样品的制备、包装、标签、标识、证书和有效期。 本标准适用于各类茶叶(除再加工茶)感官品质…

Centos7部署gitlab

建议服务器配置不低于2C8G 1、安装必要的依赖 sudo yum install -y curl policycoreutils-python openssh-server perl2、配置极狐GitLab 软件源镜像 curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash sudo yum install gitlab-jh -y3、…

DAZ To UMA⭐三.导入Blender的配置, 及Blender快捷键

文章目录 🟥 Blender快捷键1️⃣ 3D视图快捷键2️⃣ 视角快捷键3️⃣ 编辑快捷键4️⃣ 对物体的操作🟧 Blender导入FBX的配置🟩 设置脸部骨骼大小1️⃣ 切换视角2️⃣ 缩小脸部骨骼3️⃣ 本节效果预览🟦 设置眼角膜透明度🟥 Blender快捷键 1️⃣ 3D视图快捷键 快捷键…

ElementUI之登陆+注册

一.什么是ElementUI 二.ElementUI完成用户注册登录界面搭建 使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 导依赖 建立登录和注册页面 ​编辑 配置样式 编写登录页面&#xff08;Login&#xff09; 编写注册页面&#xff08;reginter&#xff09; …

ajax method to retrieve images as a blob

go 服务端&#xff1a; 就是先把这个图片读出来 然后返回二进制的数据 byteFile, err : ioutil.ReadFile("." "/processed/" uuidStr"processed.png")if err ! nil {fmt.Println(err)}c.Header("Content-Disposition", "att…