牛客网字节面试算法刷题记录

NC78 反转链表

public ListNode ReverseList (ListNode head) {if(head==null) return head;ListNode p=head.next,q,tail=head;tail.next = null;while(p!=null){q = p.next;p.next = tail;tail = p;p = q;}return tail;}

NC140 排序

冒泡排序

public int[] MySort (int[] arr) {for(int i=0;i<arr.length-1;i++){for(int j=0;j<arr.length-i-1;j++){int temp = arr[j];if(arr[j]>arr[j+1]){arr[j] = arr[j+1];arr[j+1] = temp;}}}return arr;}

快排

public int[] MySort (int[] arr) {quickSort(arr, 0, arr.length - 1);return arr;}public void quickSort(int[] arr, int low, int high) {if (low >= high) {return;}int base = findBase(arr, low, high);quickSort(arr, low, base - 1);quickSort(arr, base + 1, high);}public int findBase(int[] arr, int low, int high) {int base = arr[low];int start = low;int end = high;while (low < high) {while (low < high && arr[high] > base) {high--;}while (low < high && arr[low] <= base) {low++;}if (low < high) {int temp = arr[low];arr[low] = arr[high];arr[high] = temp;}}arr[start] = arr[high];arr[high] = base;return high;}

NC93 设计LRU缓存结构

初始简单思路:每次放新值、取某个值时候,都把它放队列最后面,这样就能把最久未用的挤到队头,这样可以保证每次超过队列容量时,删除值和放新值时间复杂度都是O(1),因此选用一个双端队列。

进一步细化:每次set一个重复值或是get一个值时,都需要将原来的某个节点给他移动到队尾,我们都知道如果是数组类型的话,这个时间复杂度是O(n-i),如何保证这个时间复杂度也是O(1)呢。因此可以使用循环链表保存前序指针和后继指针,为了方便在队首和队尾插入元素,需要两个指针来指明队首和队尾。如何判断这个值存在不存在,肯定要hashmap了,就需要把每次新产生的节点存到hashmap里面,所以需要自己定义一个类型,hashmap key为key,值为自己定义的这个类型。

还需要一个值表明容量剩余。

那么详细来说思路就是:

set函数:1.首先要判断这个key是否已经存在,如果已经存在,那么将map里的值替换掉,并将该key对应的节点从原来位置删掉,再把该节点插入到队尾。

删除逻辑又分成三种:(1)如果是普通节点,就让node.pre.next=node.next,node.next.pre=node.pre,node.pre=null,node.next=null(2)如果该节点本身就是尾节点,说明不需要移动、不做处理;(3)如果是头结点,那么node.pre就是null,如果采用上面的逻辑就会出现空指针异常,此时只能让head=node.next  node.next.pre=null node.next=null。

2.如果不存在,也分为两种情况:(1)队伍满了,需要删除队首,并将该值从hashmap删除,再生成新节点插入队尾,容量不变,仍然为0。(2)队伍还有位置,直接生成新节点插入队尾,容量减1。两种逻辑都不要忘记将新节点的key、value存入到hashmap。

get函数:1.如果存在,找到该节点,将对应节点从原来位置删除,再将该节点插入队尾。(和set部分逻辑一样,可以考虑将删除节点、将某个节点插入到队尾这两段逻辑单独拎出来作为两个函数) 2.如果不存在,返回-1。

import java.util.*;public class Solution {
//标志队首Node head;
//标志队尾Node tail;class Node {public int key;public int value;public Node pre;public Node next;public Node(int key, int value, Node pre, Node next) {this.value = value;this.key = key;this.pre = pre;this.next = next;}}HashMap<Integer, Node> map = new HashMap<>();int count = 0;int maxCap = 0;public Solution(int capacity) {maxCap = capacity;}public void print(Node n) {Node p = n;while (p != null) {System.out.print("-" + p.value);p = p.next;}System.out.println();}public int get(int key) {
//如果存在该元素,将该元素节点移动到队尾,原位置删除if (map.containsKey(key)) {Node delNode = map.get(key);Node preNode = delNode.pre;Node nextNode = delNode.next;//在原位置删除该元素//该元素本来就是队尾,直接返回无需换位置if (count == 1 || nextNode == null) return delNode.value;//如果原来是队首,删除逻辑单独处理if (preNode == null) {head = nextNode;nextNode.pre = null;delNode.next = null;} else {preNode.next = delNode.next;delNode.next.pre = preNode;}//将元素加到队尾tail.next = delNode;delNode.next = null;delNode.pre = tail;tail = delNode;// System.out.println("----get:-----");// print(head);// map.forEach((k, v)->System.out.println("k:" + k + "v:" + v.value));// System.out.println("输出:" + delNode.value);return delNode.value;} else {//如果不存在返回-1// System.out.println("----get:-----");// print(head);// map.forEach((k, v)->System.out.println("k:" + k + "v:" + v.value));// System.out.println("输出:-1");return -1;}}public void set(int key, int value) {//插入时判断是否已经有该key,有的话需要替换,并将该元素移到队尾if (map.containsKey(key)) {Node dulNode = map.get(key);dulNode.value = value;map.put(key, dulNode);//在原位置删除该元素//该元素本来就是队尾,直接返回无需换位置if (count == 1 || dulNode.next == null) return;//如果原来是队首,删除逻辑单独处理if (dulNode.pre == null) {head = dulNode.next;dulNode.next.pre = null;dulNode.next = null;} else {dulNode.pre.next = dulNode.next;dulNode.next.pre = dulNode.pre;}//将元素加到队尾tail.next = dulNode;dulNode.next = null;dulNode.pre = tail;tail = dulNode;// System.out.println("----set:-----");// print(head);// map.forEach((k, v)->System.out.println("k:" + k + "v:" + v.value));// System.out.println("输出:null");} else {// 插入时判断数量+1是否大于容量if (maxCap <= 0) return;if (count + 1 > maxCap) {//大于容量队首元素出队map.remove(head.key);Node tempNode = head.next;head.next = null;head = tempNode;head.pre = null;count--;}//新元素入队尾Node newNode = new Node(key, value, null, null);newNode.pre = tail;if (tail != null) {tail.next = newNode;} else {tail = newNode;head = newNode;head.pre = null;tail.pre = null;head.next = null;tail.next = null;}tail = newNode;count++;map.put(key, newNode);// System.out.println("----set:-----");// print(head);// map.forEach((k, v)->System.out.println("k:" + k + "v:" + v.value));// System.out.println("输出:null");}}
}/*** Your Solution object will be instantiated and called as such:* Solution solution = new Solution(capacity);* int output = solution.get(key);* solution.set(key,value);*/

NC102 在二叉树中找到两个节点的最近公共祖先

 public int lowestCommonAncestor (TreeNode root, int o1, int o2) {HashMap<Integer,Integer> hashMap = new HashMap<>();List<TreeNode> list = new ArrayList<>();list.add(root);hashMap.put(root.val,null);while(!list.isEmpty()){TreeNode node = list.get(0);if(node.left!=null){list.add(node.left);hashMap.put(node.left.val,node.val);}if(node.right!=null){list.add(node.right);hashMap.put(node.right.val,node.val);} list.remove(0);}List<Integer> pathO1 = new ArrayList<>();pathO1.add(o1);List<Integer> pathO2 = new ArrayList<>();pathO2.add(o2);findPath(hashMap,o1,pathO1);findPath(hashMap,o2,pathO2);pathO1.forEach(p->System.out.print(p+" "));System.out.println();pathO2.forEach(p->System.out.print(p+" "));int index1=pathO1.size()-1;int index2=pathO2.size()-1;while(index1>=0 && index2>=0 && pathO1.get(index1).equals(pathO2.get(index2))){index1--;index2--;}if(index1>=0 && index2>=0){return pathO1.get(index1+1);}if(index1<0){return pathO1.get(0);}if(index2<0){return pathO2.get(0);}return 0;}public void findPath(HashMap<Integer,Integer> hashMap,Integer o,List<Integer> list){while(o!=null){if(hashMap.get(o)!=null)list.add(hashMap.get(o));o = hashMap.get(o);}}

NC19 连续子数组的最大和

描述

输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。

数据范围:

1<=n<=2×105

−100<=a[i]<=100

要求:时间复杂度为O(n),空间复杂度为 O(n)

进阶:时间复杂度为 O(n),空间复杂度为 O(1)

输入[1,-2,3,10,-4,7,2,-5],返回值:18,经分析可知,输入数组的子数组[3,10,-4,7,2]可以求得最大和为18

思路

用一个动态规划数组,每个位置上的人都有两种选择,加入前面的或者不加入,每个位置上的人努力做到自己这和最大,所以会比对上一位的和加上自己的比自己本身手里的大吗,如果打不过就加入,如果加入还不如自己单干就不加入,全程将最大值记录下来,最后就可以得到最优解。

 public int FindGreatestSumOfSubArray (int[] array) {int[] dp = new int[array.length];dp[0] = array[0];int max = dp[0];for(int i=1;i<array.length;i++){dp[i] = Math.max(dp[i-1]+array[i],array[i]);if(dp[i]>max) max = dp[i];}return max;}

NC1 大数加法

这道题注意别超时,不要切割字符串转成int数组,不要用string保存结果再反转,用一个char数组保存。

 public String solve (String s, String t) {if (s.length() <= 0)return t;if (t.length() <= 0)return s;char[] res = new char[Math.max(s.length(),t.length())];int high = 0;int index1 = s.length() - 1;int index2 = t.length() - 1;while (index1 >= 0 && index2 >= 0) {int add = s.charAt(index1) - '0' + t.charAt(index2) - '0' + high;res[index2] = (char)( add % 10 + '0');if (add >= 10) high = 1;else high = 0;index1--;index2--;}while (index1 >= 0) {int add =  s.charAt(index1) - '0' + high;res[index1] = (char)( add % 10 + '0');if (add >= 10) high = 1;else high = 0;index1--;}while (index2 >= 0) {int add = t.charAt(index2) - '0' + high;res[index2] = (char)( add % 10 + '0');if (add >= 10) high = 1;else high = 0;index2--;}String result = String.valueOf(res);if (high == 1) result = "1" + result;return result;}

NC41 最长无重复子数组

这题直接暴力法,第一层遍历用i从头到尾,第二层遍历用index从i到尾,如果遍历过程中遇到的map里没有就length加一,加入map,如果遇到重复的,比较length是否大于max,大于则替换,将mao清空,break退出此次。

public int maxLength (int[] arr) {int max = -1;int length = 0;HashMap<Integer, Boolean> hashMap = new HashMap<>();for (int i = 0; i < arr.length; i++) {for (int index = i; index < arr.length; index++) {if (!hashMap.containsKey(arr[index])) {hashMap.put(arr[index], true);length++;if (length > max) max = length;} else {hashMap.clear();length = 0;break;}}}return max;}

NC38 螺旋矩阵

描述

给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。

数据范围:0≤n,m≤10,矩阵中任意元素都满足 0∣val∣≤100

要求:空间复杂度 O(nm) ,时间复杂度 O(nm)

输入 [[1,2,3],[4,5,6],[7,8,9]]    输出 [1,2,3,6,9,8,7,4,5]

思路

递归函数,设置上top下down左left右right四个值作为四个方向的边界,先从左向右输出(j=left,j<right避免和下一个方向的输出重复),再从上往下输出(i=top,i<down),从右往左输出(j=right,j>left),从下往上输出(i=down,i>top),然后将top++,down--,left++,right--传入递归

递归出口为left>right或者top>down

需要处理的一个特殊情况是当left==right或者top==down时说明是单列、单行,此时要将此列、行单独输出后返回。

代码

 public ArrayList<Integer> spiralOrder (int[][] matrix) {int m = matrix.length;ArrayList<Integer> res = new ArrayList<>();if(m==0) return res;int n = matrix[0].length;circle(matrix, 0, n-1, 0, m-1, res);return res;}public void circle(int[][] matrix, int left, int right, int top, int down,ArrayList<Integer> res) {if(left>right || top>down) return;if(left==right){//只有一列按列遍历for(int i=top;i<=down;i++){res.add(matrix[i][left]);}return;}if(top==down){//只有一行按行遍历for(int j=left;j<=right;j++){res.add(matrix[down][j]);}return;}for(int j=left;j<right;j++){res.add(matrix[top][j]);}for(int i=top;i<down;i++){res.add(matrix[i][right]);}for(int j=right;j>left;j--){res.add(matrix[down][j]);}for(int i=down;i>top;i--){res.add(matrix[i][left]);}circle(matrix,left+1,right-1,top+1,down-1,res);}

NC17 最长回文子串

描述

对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。

数据范围: 1≤n≤1000

要求:空间复杂度 O(1),时间复杂度 O(n2)

进阶:  空间复杂度O(n),时间复杂度 O(n)

思路

暴力:i遍历字符串,index遍历从i到字符串尾,对每个子串s.subString(i,index+1),如果是回文串,记录长度,如果大于最大值覆盖。

另外需要一个判断是否为回文串的函数。

时间复杂度为O(N^2)+O(n)

代码

ublic int getLongestPalindrome (String A) {int maxLength = 1;int length = 1;for (int i = 0; i < A.length(); i++) {int index = i;length = 1;for (; index < A.length(); index++) {if (isPalindrome(A.substring(i, index+1))) {length = A.substring(i, index+1).length();if (length > maxLength) {maxLength = length;}}}}return maxLength;}public boolean isPalindrome(String A) {int length = A.length();Stack<Character> stack = new Stack<>();for (int i = 0; i < length; i++) {if (length % 2 != 0) {if (i < length / 2) {stack.add(A.charAt(i));} else if (i > length / 2) {if (stack.isEmpty() || !stack.pop().equals(A.charAt(i))) {return false;}}} else {if (i < length / 2) {stack.add(A.charAt(i));} else if (i >= length / 2) {if (stack.isEmpty() || !stack.pop().equals(A.charAt(i))) {return false;}}}}if (!stack.isEmpty()) return false;return true;}

NC54 三数之和

描述

给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。

数据范围:0≤n≤1000,数组中各个元素值满足 ∣val∣≤100

空间复杂度:O(n2),时间复杂度 O(n2)

注意:

  1. 三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c)
  2. 解集中不能包含重复的三元组。
例如,给定的数组 S = {-10 0 10 20 -10 -40},解集为(-10, -10, 20),(-10, 0, 10) 

思路

先将数组排序(时间复杂度O(logn)),用i遍历数组。对每一个i进行循环:i右侧的第一个元素下标赋值给low,最后一个元素下标赋值给high,如果low和high所在位置数字相加等于-arr[i]将这三个元素加入到结果,同时low++,high--来继续寻找,如果小于则low++,如果大于则high--。该循环结束条件应为low不超过右边界(长度-1),high不超过左边界(0),且low<high。

除此之外要考虑去重的问题,可能有两种情况出现重复,

第一种是元素重复被选中:假设输入为[-40,-10,-10,0,10,20]的情况下,如果i遍历到第一个-10,下面去遍历会找到[-10,20][0,10],等到i遍历到第二个-10一样会得到相同的结果,这样就会产生重复。对这种重复的解决办法是,如果arr[i]==arr[i-1]就跳过(所以i需要从1开始)

第二种是进行双指针查找的区间里出现重复值:假设输入为[-10,-10,0,0,10,],i遍历到-10,找到[0,10],[0,10]两个重复。对这种的处理方式是如果arr[low]==arr[low-1]则跳过arr[low],如果arr[high]==arr[high+1]则跳过arr[high]。

为了防止数据越界,此处需要限制high<=arr.length-1,本来也应该限制low>=0,但是low的左边界是i不是0,所以此处应该是限制low>i+1(如果low取i+1,那么也会将arr[i]和arr[i+1]进行比较,arr[i]是我们选中的数,他允许和查找范围内的重复,所以显然不能取此值)

代码

public ArrayList<ArrayList<Integer>> threeSum (int[] num) {//先排序Arrays.sort(num);ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();for (int i = 0; i < num.length; i++) {if (i >= 1 && num[i] == num[i - 1]) {continue;}int low = i + 1;int high = num.length - 1;while (low <= num.length - 1 && high >= 1 && low < high) {if (low > i+1 && num[low] == num[low - 1]) {low++;continue;}if (high + 1 <= num.length - 1 && num[high] == num[high + 1]) {high--;continue;}if (num[low] + num[high] == 0 - num[i]) {ArrayList<Integer> tempList = new ArrayList<Integer>();tempList.add(num[i]);tempList.add(num[low]);tempList.add(num[high]);result.add(new ArrayList<Integer>(tempList));low++;high--;} else if (num[low] + num[high] < 0 - num[i]) {low++;} else {high--;}}}return result;}

NC32 求平方根

描述

实现函数 int sqrt(int x).

计算并返回 x 的平方根(向下取整)

数据范围: 0<=x<231−1

要求:空间复杂度 O(1),时间复杂度 O(logx)

代码

public int sqrt (int x) {int low = 1;int high = x;if (x == 1) return 1;while (low <= high) {int mid = (low + high) / 2;if (x / mid >= mid && x / (mid + 1) <= mid) {return mid;} else if (x / mid >= mid) {low = mid + 1;} else {high = mid - 1;}}return 0;}

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

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

相关文章

计算机竞赛 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…

Go面试题:锁的实现原理sync-mutex篇

在Go中&#xff0c;主要实现了两种锁&#xff1a;sync.Mutex(互斥锁) 以及 sync.RWMutex(读写锁)。 本篇主要给大家介绍sync.Mutex的使用和实现原理。 文章目录 为什么需要锁在Go中对于并发程序进行公共资源的访问的限制最常用的就是互斥锁&#xff08;sync.mutex&#xff09…

git branch -r 远程分支显示不全

找回csdn帐号了&#xff0c;计划陆续开始更新最近的笔记√ 没想到很久没登还有人在看 问题描述 git 查看项目远程分支&#xff1a; git branch -r返回结果很少。但GitHub页面上能看到很多的分支。 尝试git remote update&#xff0c;发现结果仍然如此。 PS C:\Users\dell\g…

AUTOSAR汽车电子嵌入式编程精讲300篇-基于AUTOSAR架构的AT控制系统研究与实现

目录 前言 国内外研究现状 国外研究现状 国内研究现状 2 AUTOSAR规范及开发流程

分析各大常用的JS加密优缺点

Base64编码&#xff1a; 优点&#xff1a; 简单&#xff0c;易于实现。不是真正的加密&#xff0c;只是编码&#xff0c;可以用于数据传输和存储。 缺点&#xff1a; 不提供数据保密性&#xff0c;容易被解码。 示例代码&#xff1a; // 编码 const encodedData btoa(Hello,…

Windows 使用nvm安装多个版本的node.js

在 Windows 上&#xff0c;首先你需要安装 Node Version Manager。请访问 nvm-windows GitHub 页面并下载最新版本的 nvm-setup.zip 文件。解压并运行里面的安装程序。 安装完成后&#xff0c;你可以按照以下步骤使用 Node Version Manager (nvm) 来安装和管理多个版本的 Node…

前后端分离毕设项目之基于springboot+vue的笔记记录分享网站设计与实现(内含源码+文档+部署教程)

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

【陕西理工大学-数学软件实训】数学实验报告(8)(数值微积分与方程数值求解)

目录 一、实验目的 二、实验要求 三、实验内容与结果 四、实验心得 一、实验目的 1. 掌握求数值导数和数值积分的方法。 2. 掌握代数方程数值求解的方法。 3. 掌握常微分方程数值求解的方法。 二、实验要求 1. 根据实验内容&#xff0c;编写相应的MATLAB程序&#xff0c…

ChatGLM DeepSpeed/P-Tuning v2 调参

之前尝试了基于ChatGLM-6B使用LoRA进行参数高效微调,本文给大家分享使用DeepSpeed和P-Tuning v2对ChatGLM-6B进行微调,相关代码放置在GitHub上面:llm-action。 ChatGLM-6B简介 ChatGLM-6B相关的简介请查看之前的文章,这里不再赘述。 P-Tuning v2简介 P-Tuning是一种较新…

构建工具vite/webpack

一、vite 快速开始 全局安装vite npm i -g vite创建vite npm create vite安装依赖 npm i运行项目 npm run dev 二、webpack 1、使用步骤 初始化项目npm init -y安装依赖webpack、webpack-cli在项目中创建src目录&#xff0c;然后编写代码&#xff08;默认主文件index.js&a…

Linux常用工具

文章目录 前言一、Linux编辑器-vim使用1.vim的基本概念2. vim的基本操作3. vim命令集1. 正常模式1. 模式切换和光标移动2. 删除文字及复制3. 其他操作 2. 底行模式 二、Linux编译器-gcc/g使用1. 命令和选项2. 预处理3. 编译4. 汇编(生成机器可识别代码)5. 连接(生成可执行文件或…

Docker 部署 MongoDB 服务

拉取最新版本的 MongoDB 镜像&#xff1a; $ sudo docker pull mongo:latest在本地预先创建好 db 和 configdb 目录, 用于映射 MongoDB 容器内的 /data/db 和 /data/configdb 目录。 使用以下命令来运行 MongoDB 容器: $ sudo docker run -itd --name mongo --privilegedtru…

C#webform Static DataTable 多人同时操作网页数据重复问题

在C# Web Forms中&#xff0c;如果声明一个static变量&#xff0c;它将在整个应用程序域&#xff08;Application Domain&#xff09;中保持持久化状态。每个用户的请求都在同一个应用程序域中处理&#xff0c;因此static变量在不同页面间保持相同的值。 当一个用户发起请求时…

LCP 02.分式化简

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;110. 平衡二叉树 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 模拟分式计算过程即可。 解题代码&#xff1a; class Solution {public int[] fraction(int[] cont) {if(cont.length1){…

JPEG算法及例程

JPEG&#xff08;Joint Photographic Experts Group&#xff09;是一种常见的图像压缩算法&#xff0c;用于减小图像文件的大小。它是一种有损压缩算法&#xff0c;即通过牺牲一定的图像质量来实现压缩。 以下是一个简单的JPEG压缩算法的例程&#xff1a; 将输入图像转换为YUV…

抖音seo矩阵系统源代码分享

技术开发注意事项&#xff1a; 确定业务需求&#xff1a;在开发前&#xff0c;需要明确抖音矩阵系统的业务需求&#xff0c;了解用户的需求和使用习惯&#xff0c;明确系统的功能、性能和安全需求。 选择合适的技术方案&#xff1a;根据系统的需求和复杂度&#xff0c;选择合适…

ibevent 定制——libevent 定制内存分配

libevent 定制内存分配 默认情况下,libevent 使用 C 库的内存管理函数在堆上分配内存。通过提供 malloc、realloc和 free 的替代函数,可以让 libevent 使用其他的内存管理器。希望 libevent 使用一个更高效的分配器时;或者希望 libevent 使用一个工具分配器,以便检查内存泄漏时…

有多条业务线,mysql建多库多表比较好还是一个库多个表比较好呢?

选择使用多库多表还是一个库多个表&#xff0c;取决于你的具体情况和需求。以下是一些考虑因素&#xff1a; 数据隔离&#xff1a;如果每条业务线需要完全独立的数据隔离&#xff0c;例如不同业务线的数据不会相互关联或共享&#xff0c;那么使用多库可以更好地实现数据隔离。 …

JavaWeb 学习笔记 3:Servlet

JavaWeb 学习笔记 3&#xff1a;Servlet 1.简介 Servlet 是 JavaEE 定义的一套 Web 应用开发标准&#xff08;接口&#xff09;&#xff0c;实现了该技术的 Web 服务器软件&#xff08;如 Tomcat&#xff09;上可以运行一个 Servlet 容器&#xff0c;只要我们使用 Servlet 技…

Python 移动文件到指定路径

需求&#xff1a;将指定的文件从指定目录移动到用户指定的目标目录。 shutil 是 Python 标准库中的一个模块&#xff0c;它提供了许多文件和文件集合的高级操作。基本上&#xff0c;它可以帮助我们执行文件操作&#xff0c;例如复制、移动、更名和删除。它旨在与 os 模块一起使…