62-Java-面试专题(1)__基础
62-Java-面试专题(1)__基础-- 笔记
笔记内容来源与黑马程序员教学视频
文章目录
- 62-Java-面试专题(1)__基础-- 笔记
- Java-面试专题(1)
- 笔记中涉及资源:
- 一、二分查找
- ①:代码实现
- 1. 流程
- 2. 代码实现
- 3. 测试
- ②:解决整数溢出(方法一)
- ③:解决整数溢出(方法二)
- ③:选择题目
- ④:注意事项
- 二、冒泡排序
- ①:初步实现
- ②:减少冒泡次数
- ③:进一步优化
- ④:总结
- 三、选择排序
- ①:代码实现
- ②:总结
- 四、插入排序
- ①:代码实现
- ②:总结
- ③:插入和选择推到某一论排序结果
- 五、快速排序
- ①:文字描述
- ②:单边循环
- ③:双边循环
- 1. 代码实现
- 2. 注意事项
- ④:特点
- 六、ArrayList扩容规则
- 七、Iterator_FailFast_FailSafe
- 八、LinkedList
- 九、HashMap
Java-面试专题(1)
笔记中涉及资源:
一、二分查找
①:代码实现
1. 流程
-
前提:有已排序数组A(假设已经做好)
-
定义左边界L、右边界R,确定搜索范围,循环执行二分查找(3、4两步)
-
获取中间索引M=Floor(L+R)/2)
-
中间索引的值A[M]与待搜索的值T进行比较
- ① A[M]==T表示找到,返回中间索引
- ② A[M>T,中间值右侧的其它元素都大于T,无需比较,中间索引左边去找,M-1设置为右边界,重新查找
- ③ A[M]<T,中间值左侧的其它元素都小于T,无需比较,中间索引右边去找,M+1设置为左边界,重新查找
-
当L>R时,表示没有找到,应结束循环
2. 代码实现
/*** 数据准备初始化一个排好序的数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 10;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}// 排序Arrays.sort(array);return array;}/*** 二分查找代码实现*/public static void testBinarySearch() {int[] array = initArray();System.out.println(Arrays.toString(array));System.out.println("请输入您要查找的数据:");int number = scanner.nextInt();// 初始化 开头 结尾 中间的下标int start = 0, end = array.length -1, middle;while (start <= end) {middle = (start + end) >>1;if (array[middle] == number){System.out.println("您要查找的数字下标为:" + middle);return;}else if (array[middle] > number){end = middle - 1;}else {start = middle +1;}}System.err.println("您要查找的数字不存在!");}public static void main(String[] args) {testBinarySearch();}
3. 测试
②:解决整数溢出(方法一)
③:解决整数溢出(方法二)
③:选择题目
- 1.有一个有序表为1,5,8,11,19,22,31,35,40,45,48,49,50当二分查找值为48的结点时,查找成功需要比较的次数
4次
-
奇数二分取中间
-
偶数二分取中间靠左
-
2.使用二分法在序列1,4,6,7,15,33,39,50,64,78,75,81,89,96中查找元素81时,需要经过()次比较
4次
- 3.在已经的128个数组中二分查找一个数,需要比较的次数最多不超过多少次
7次
- 2n=128或128/2/2…直到1
- 问题转化log^2 128,如果手边有计算器,用log10 128/log10 2
- 是整数,则该整数即为最终结果
- 是小数,则舍去小数部分,整数加一为最终结果
④:注意事项
- 1.目前介绍的二分查找是以jdk中Arrays.binarySearch的实现作为讲解示范,后续选择题的解答思路也是以此为准
- 2.但实际上,二分查找有诸多变体,一旦使用变体的实现代码,则左右边界的选取会有变化,进而会影响之前选择题的答案选择
二、冒泡排序
①:初步实现
/*** 数据准备初始化一个数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 5;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}return array;}public static void main(String[] args) {// 调用方法获取一个无序的数组int[] array = initArray();System.out.println("排序前 :" + Arrays.toString(array));for (int i = 0; i < array.length -1; i++) {for (int j = 0; j < array.length - 1 - i; j++) {if (array[j] > array[j + 1]){array[j + 1] = array[j + 1] + array[j];array[j] = array[j + 1] - array[j];array[j + 1] = array[j + 1] - array[j];}}}System.out.println("排序后 :" + Arrays.toString(array));}
②:减少冒泡次数
/*** 数据准备初始化一个数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 5;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}return array;}public static void main(String[] args) {// 调用方法获取一个无序的数组int[] array = initArray();System.out.println("排序前 :" + Arrays.toString(array));for (int i = 0; i < array.length -1; i++) {// 是否发生交换boolean swapped = false;for (int j = 0; j < array.length - 1 - i; j++) {System.out.println("比较次数:" + j);if (array[j] > array[j + 1]){array[j + 1] = array[j + 1] + array[j];array[j] = array[j + 1] - array[j];array[j + 1] = array[j + 1] - array[j];swapped = true;}}if (!swapped) {break;}System.out.println("第" + (i+1) + "排序 :" + Arrays.toString(array));}}
③:进一步优化
/*** 数据准备初始化一个数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 5;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}return array;}public static void main(String[] args) {// 调用方法获取一个无序的数组int[] array = initArray();int n = array.length - 1;System.out.println("排序前 :" + Arrays.toString(array));for (int i = 0; i < n; i++) {int last = 0;for (int j = 0; j < n; j++) {System.out.println("比较次数:" + j);if (array[j] > array[j + 1]){array[j + 1] = array[j + 1] + array[j];array[j] = array[j + 1] - array[j];array[j + 1] = array[j + 1] - array[j];last = j;}}n = last;System.out.println("第" + (i+1) + "排序 :" + Arrays.toString(array));}}
④:总结
-
文字描述
(以升序为例)- 1.依次比较数组中相邻两个元素大小,若[a]>a[+1],则交换两个元素,两两都比较一遍称为一轮冒泡,结果是让最大的元素排至最后
- 2.重复以上步骤,直到整个数组有序
-
优化方式:
- 每轮冒泡时,最后一次交换索引可以作为下一轮冒泡的比较次数,如果这个值为零,表示整个数组有序,直接退出外层循环即可
三、选择排序
①:代码实现
/*** 数据准备初始化一个数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 5;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}return array;}public static void main(String[] args) {int[] array = initArray();System.out.println("排序前 :" + Arrays.toString(array));for (int i = 0; i < array.length - 1; i++) {// 每轮最小值对应的下标int minIndex = i;for (int j = i + 1; j < array.length; j++) {if (array[minIndex] > array[j]){minIndex = j;}}if (minIndex != i) {array[i] = array[minIndex] + array[i];array[minIndex] = array[i] - array[minIndex];array[i] = array[i] - array[minIndex];}System.out.println("第" + (i+1) + "次排序 :" + Arrays.toString(array));}}
②:总结
文字描述(以升序为例)
- 1.将数组分为两个子集,排序的和未排序的,每一轮从未排序的子集中选出最小的元素,放入排序子集
- 2.重复以上步骤,直到整个数组有序
优化方式
- 1.为减少交换次数,每一轮可以先找最小的索引,在每轮最后再交换元素
与冒泡排序比较
- 1.二者平均时间复杂度都是0(n2)
- 2.选择排序一般要快于冒泡,因为其交换次数少
- 3.但如果集合有序度高,冒泡优于选择
- 4.冒泡属于稳定排序算法,而选择属于不稳定排序
四、插入排序
①:代码实现
/*** 数据准备初始化一个数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 5;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}return array;}public static void main(String[] args) {int[] array = initArray();System.out.println("排序前 :" + Arrays.toString(array));for (int i = 1; i < array.length; i++) {// 假设最小值int minNum = array[i];int j = i-1;while (j >= 0) {if (minNum < array[j]) {array[j + 1] = array[j];}else {break;}j--;}array[j + 1] = minNum;System.out.println("第" + (i) + "次排序 :" + Arrays.toString(array));}}
②:总结
文字描述(以升序为例)
- 1.将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需保证顺序)
- 2.重复以上步骤,直到整个数组有序
优化方式 - 1.待插入元素进行比较时,遇到比自己小的元素,就代表找到了插入位置,无需进行后续比较
- 2.插入时可以直接移动元素,而不是交换元素
与选择排序比较 - 1.二者平均时间复杂度都是0(n2)
- 2.大部分情况下,插入都略优于选择
- 3.有序集合插入的时间复杂度为O(m)公
- 4.插入属于稳定排序算法,而选择属于不稳定排序
③:插入和选择推到某一论排序结果
1. 使用直接插入排序算法对序列18,23,19,9,23,15进行排序,第三趟排序后的结果为()
- A.9,18,15,23,19,23
- B.18,23,19,9,23,15
- C.18,19,23,9,23,15
- D.9,18,19,23,23,15
2. 使用直接选择排序算法对序列18,23,19,9,23,15进行排序,第3趟排序后的结果为()
- A.9,23,19,18,23,15
- B.9,15,18,19,23,23
- C.18,19,23,9,23,15
- D.18,19,23,9,15,23
五、快速排序
①:文字描述
-
每一轮排序选择一个基准点(pivot)进行分区
- 1.让小于基准点的元素的进入一个分区,大于基准点的元素的进入另一个分区
- 2.当分区完成时,基准点元素的位置就是其最终位置
-
在子分区内重复以上过程,直至子分区元素个数少于等于1,这体现的是分而治之的思想(divide-and-conquer)
②:单边循环
单边循环快排(lomuto洛穆托分区方案)
- 选择最右元素作为基准点元素
- j指针负责找到比基准点小的元素,一旦找到则与ⅰ进行交换
- ⅰ指针维护小于基准点元素的边界,也是每次交换的目标索引
- 最后基准点与ⅰ交换,ⅰ即为分区位置
/*** 数据准备初始化一个数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 5;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}return array;}/*** 选择一个基准点(pivot)进行分区* @param array 排序数组* @param l 左边界* @param pivot 基准点* @return 返回值 = 分区后中间索引值*/public static int partition(int[] array, int l, int pivot){// 右侧基准点(值)int pivotNum = array[pivot];int i = l;for (int j = l; j < pivot; j++) {if (array[j] < pivotNum) {if (i != j){swap(array, i, j);}i ++;}}if (i != pivot){swap(array, i, pivot);}return i;}/*** 交换位置* @param array 数组* @param i 位置1* @param j 位置2*/private static void swap(int[] array, int i, int j) {int temp = array[j];array[j] = array[i];array[i] = temp;}/*** 递归排序* @param array 排序数组* @param l 左边界* @param pivot 基准点*/public static void quick(int[] array, int l, int pivot){if (l >= pivot){return;}int index = partition(array, l, pivot);quick(array,l, index -1);quick(array,index +1,pivot);}public static void main(String[] args) {int[] array = initArray();System.out.println("排序前 :" + Arrays.toString(array));quick(array, 0, array.length - 1);System.out.println("排序后 :" + Arrays.toString(array));}
③:双边循环
双边循环快排(并不完全等价于hoare霍尔分区方案)
- 选择最左元素作为基准点元素
- j指针负责从右向左找比基准点小的元素,ⅰ指针负责从左向右
找比基准点大的元素,一旦找到二者交换,直至ⅰ,j相交 - 最后基准点与ⅰ(此时ⅰ与j相等)交换,ⅰ即为分区位置
1. 代码实现
/*** 数据准备初始化一个数组*/public static int[] initArray(){Random random = new Random();// 创建一个数组,长度在10-20之间int len = random.nextInt(10) + 5;int[] array = new int[len];// 遍历添加数据for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(100);}return array;}/*** 选择一个基准点(pivot)进行分区* @param array 排序数组* @param l 左边界* @param r 右边界* @return 返回值 = 分区后中间索引值*/public static int partition(int[] array, int l, int r){// 左侧基准点(值)int pivotNum = array[l];int i = l;int j = r;while (i < j) {// j从右边找比基准点小的值while (i < j && array[j] > pivotNum){j--;}// i 从左边找比基准点大的值while (i < j && array[i] <= pivotNum){i++;}swap(array, i, j);}swap(array, i, l);return i;}/*** 交换位置* @param array 数组* @param i 位置1* @param j 位置2*/private static void swap(int[] array, int i, int j) {int temp = array[j];array[j] = array[i];array[i] = temp;}/*** 递归排序* @param array 排序数组* @param l 左边界* @param pivot 基准点*/public static void quick(int[] array, int l, int pivot){if (l >= pivot){return;}int index = partition(array, l, pivot);quick(array,l, index -1);quick(array,index +1,pivot);}public static void main(String[] args) {int[] array = initArray();System.out.println("排序前 :" + Arrays.toString(array));quick(array, 0, array.length - 1);System.out.println("排序后 :" + Arrays.toString(array));}
2. 注意事项
-
1.基准点在左边,并且要先 j 后 i (先从右边找在从左边找)
-
2.while ( i < j && array[ j ] > pivotNum)
// j从右边找比基准点小的值
while (i < j && array[j] > pivotNum){j--;
}
- 3.while (i < j && array[i] <= pivotNum)
// i 从左边找比基准点大的值
while (i < j && array[i] <= pivotNum){i++;
}
④:特点
附绿
- 洛穆托vs霍尔 https:/qastack.cn/cs/11458/quicksort-partitioning-hoare-Vs-lomuto
六、ArrayList扩容规则
可以看看这位博主的:https://www.cnblogs.com/ruoli-0/p/13714389.html
- ArrayList()会使用长度为零的数组
- 直接调用无参方法初始容量为0(空数组)
- ArrayList(int initialCapacity)会使用指定容量的数组
- 调用有参方法数组容量为传入的容量值
- public ArrayList(Collection<?extends E>c)会使用c的大小作为数组容量
- 传入的是一个集合使用的是集合的大小
- add(0 bject o)首次扩容为10,再次扩容为上次容量的1.5倍
- addAll(Collection c)没有元素时,扩容为Math.max(10,实际元素个数),有元素时为Math.max(原容量1.5倍,实际元素个数)
- 如过集合中没有元素 扩容会在(10和实际元素个数)中选择一个大的,有元素时扩容会在(原容量1.5倍和实际元素个数)选择一个大的
ArrayList的特点:
-
1.ArrayList的底层数据结构是数组,所以查找遍历快,增删慢。
-
2.ArrayList可随着元素的增长而自动扩容,正常扩容的话,每次扩容到原来的1.5倍。
-
3.ArrayList的线程是不安全的。
ArrayList的扩容:
扩容可分为两种情况:
第一种情况,当ArrayList的容量为0时,此时添加元素的话,需要扩容,三种构造方法创建的ArrayList在扩容时略有不同:
-
1.无参构造,创建ArrayList后容量为0,添加第一个元素后,容量变为10,此后若需要扩容,则正常扩容。
-
2.传容量构造,当参数为0时,创建ArrayList后容量为0,添加第一个元素后,容量为1,此时ArrayList是满的,下次添加元素时需正常扩容。
-
3.传列表构造,当列表为空时,创建ArrayList后容量为0,添加第一个元素后,容量为1,此时ArrayList是满的,下次添加元素时需正常扩容。
第二种情况,当ArrayList的容量大于0,并且ArrayList是满的时,此时添加元素的话,进行正常扩容,每次扩容到原来的1.5倍。
七、Iterator_FailFast_FailSafe
- ArrayList是fail-fast的典型代表,遍历的同时不能修改,尽快失败
- CopyOnWriteArrayList是fail-safe的典型代表,遍历的同时可以修改,原理是读写分离
并发篇-32-ConcurrentHashMap
八、LinkedList
九、HashMap
相关文章:

62-Java-面试专题(1)__基础
62-Java-面试专题(1)__基础-- 笔记 笔记内容来源与黑马程序员教学视频 文章目录 62-Java-面试专题(1)__基础-- 笔记Java-面试专题(1)笔记中涉及资源: 一、二分查找①:代码实现1. 流程2. 代码实现3. 测试 ②:解决整数溢出(方法一&…...

快速构建数据产品原型 —— 我用 VChart Figma 插件
快速构建数据产品原型 —— 我用 VChart Figma 插件 10 种图表类型、24 种内置模板类型、丰富的图表样式配置、自动生成图表实现代码。VChart Figma 插件的目标是提供 便捷好用 & 功能丰富 & 开发友好 的 figma 图表创建能力。目前 VChart 插件功能仍在持续更新中&…...

登录—令牌技术
这里写目录标题 令牌技术2.4.1 JWT令牌2.4.2 jwt使用 令牌技术 令牌,其实它就是一个用户身份的标识,其实本质就是一个字符串。 如果通过令牌技术来跟踪会话,就可以在浏览器发起请求。在请求登录接口的时候,如果登录成功ÿ…...

NPOI 操作详解(操作Excel)
目录 1. 安装 NPOI 2. 使用 NPOI 创建新 Excel 文件 3. 设置列宽和行高 1. 设置列宽 2. 设置行高 3. 同时设置列宽和行高 4. 设置统一的行高 5. 设置统一的列宽 6. 应用统一的行高和列宽 4. 合并单元格 5. 设置单元格样式(字体、边框、背景色等…...

2024年北京海淀区中小学生信息学竞赛校级预选赛试题
2024年北京海淀区中小学生信息学竞赛校级预选赛试题 题目总数:24 总分数:100 编程基础知识单选题 第 1 题 单选题 关于 2024年海淀区信息学竞赛的描述错误的是( ) A.报名在网上报名系统进行 B.必须经过学籍所在学校的指导教师审核 C.学校…...

GPT-SoVITS 部署方案
简介 当前主流的开源TTS框架,这里介绍部署该服务的主要流程和我在使用过程中出现的问题。 使用的技术 Docker、Jupyter、Python、C# 部署 docker的使用 拉取命令 docker pull jupyter/base-notebook:python-3.10.11jupyter的访问 docker运行以后可以直接使用…...

pdf添加目录标签python(手动配置)
先安装对应的库: pip install pypdf 代码分为两个部分,一部分是config.py,代码如下: offset=10 catgorys=[("第一章",12),("第二章",45), ] 需要自己手动更改offset,和目录列表 下面是主要代码: import pypdf # import sys from config import…...

Ngrok 在树莓派上的配置与使用教程
Ngrok 是一个便捷的工具,用于将本地服务器暴露到互联网上,常用于开发和调试。 1. 更新树莓派 首先,更新树莓派的系统: sudo apt update sudo apt upgrade -y2. 安装 Ngrok (1)下载 Ngrok: 访…...

多核架构的基本概念
目录 1.为什么使用多核 2.多核分类 2.1 同构和异构 2.2 SMP和AMP 3 小结 1.为什么使用多核 这个问题个人认为可以从两个方面来看: 性能问题 随着汽车ECU对集成化的要求越来越高,把多个ECU功能集中到一个多核MCU的需求也越来越明显。 以汽车制动…...

yolov8模型推理测试代码(pt/onnx)
🦖yolov8训练出来的模型,不使用detect.py代码进行模型测试🦖 pt格式模型测试 import cv2 import os from ultralytics import YOLO # 定义输入和输出文件夹路径 input_folder /input/folder # 输入文件夹 output_folder /output/folder …...

二叉树 最大深度(递归)
给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:root [1,null,2] 输出…...

C++详细笔记(五)
1.类和对象 1.1运算符重载(补) 1.运算符重载中,参数顺序和操作数顺序是一致的。 2.一般成员函数重载为成员函数,输入流和输出流重载为全局函数。 3.由1和2只正常的成员函数默认第一个参数为this指针而重载中参数顺序和操作数顺…...

简易CPU设计入门:译码模块(一)
项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后ÿ…...

力扣题目解析--三数之和
题目 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示…...

qt QTabWidget详解
1、概述 QTabWidget是Qt框架中的一个控件,它提供了一个标签页式的界面,允许用户在不同的页面(或称为标签)之间切换。每个页面都可以包含不同的内容,如文本、图像、按钮或其他小部件。QTabWidget非常适合用于创建具有多…...

linux shell脚本学习(1):shell脚本基本概念与操作
1.什么是shell脚本 linux系统中,shell脚本或称之为bash shell程序,通常是由vim编辑,由linux命令、bash shell指令、逻辑控制语句、注释信息组成的可执行文件 *linux中常以.sh后缀作为shell脚本的后缀。linux系统中文件乃至脚本的后缀并没有…...
Savitzky-Golay(SG)滤波器
Savitzky-Golay(SG)滤波器是一种在时域内基于局域多项式最小二乘法拟合的滤波方法,它最初由Savitzky A和Golay M于1964年提出,并广泛应用于数据流平滑除噪。 基本介绍 一、基本原理 SG滤波器通过在滑动窗口内拟合多项式来平滑数…...

Webserver(2.7)共享内存
目录 共享内存共享内存实现进程通信 共享内存 共享内存比内存映射效率更高,因为内存映射关联了一个文件 共享内存实现进程通信 write.c #include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <string.h>int main(){…...

【网安案例学习】凭证填充Credential Stuffing
### 凭证填充的深入讨论 凭证填充(Credential Stuffing)是一种网络攻击技术,攻击者利用从数据泄露中获取的大量用户名和密码组合,尝试在其他网站和服务上进行自动化登录。这种攻击依赖于用户在多个网站上重复使用相同密码的习惯。…...

网站建设公司怎么选?网站制作公司怎么选才不会出错?
寻找适合靠谱的网站设计公司,不要盲目选广告推最多的几家,毕竟要实现自身品牌营销,还是需要多方面考量。以下几个方面可以作为选择的参考: 1. 专业能力如何? 一个公司的专业能力,决定了最后网站设计的成果…...

19. 架构重要需求
文章目录 第19章 架构重要需求19.1 从需求文档中收集架构重要需求(ASRs)不要抱太大希望从需求文档中找出架构重要需求 19.2 通过访谈利益相关者收集架构重要需求19.3 通过理解业务目标收集架构重要需求19.4 在效用树中捕获架构重要需求19.5 变化总会发生…...

iOS 再谈KVC、 KVO
故事背景:大厂面试,又问道了基本的kvc kvo的原理和使用,由于转了前端,除了个setter和getter,我全忘记了,其实还是没有理解记忆,下面再看一下kvc 和kvo ,总结一个让人通过理解而无法忘记的方法&a…...

java、excel表格合并、指定单元格查找、合并文件夹
#创作灵感# 公司需求 记录工作内容 后端:JAVA、Solon、easyExcel、FastJson2 前端:vue2.js、js、HTML 模式1:合并文件夹 * 现有很多文件夹 想合并全部全部的文件夹的文件到一个文件夹内 * 每个部门发布的表格 合并全部的表格为方便操作 模…...

最基础版编译运行Java(纯小白)
流程图: ⚠ 需要先安装JDK (Java Development Kit) 1. 写文件 首先写好自己的“文件”,可以用Sublime Text等文本编辑器写,还可以直接新建文本文档写一个.txt文件。 以编写一个HelloWorld程序为例: public class HelloWorld{p…...

六西格玛项目助力,手术机器人零部件国产化稳中求胜——张驰咨询
项目背景 XR-1000型腔镜手术机器人是某头部手术机器人企业推出的高端手术设备,专注于微创手术领域,具有高度的精确性和稳定性。而XR-1000型机器人使用的部分核心零部件长期依赖进口,特别是高精度电机、关节执行机构和视觉系统等,…...

Python爬虫系列(一)
目录 一、urllib 1.1 初体验 1.2 使用urllib下载网页、图片、视频等 1.3 反爬介绍 1.4 请求对象定制 1.5 get请求的quote方法 1.6 多个参数转成ascii编码 1.7 post请求 1.8 综合案例演示 一、urllib 1.1 初体验 # urllib是python默认带的,无需额外下载 i…...

# vim那些事...... vim删除文件全部内容
vim那些事… vim删除文件全部内容 1、在 Vim 中删除整个文件的内容,可以使用以下命令: 1)打开 Vim,并编辑你想要清空的文件。 2)按 Esc 确保你不在插入模式,而在命令模式。 3)输入 gg 跳转到…...

Selinux及防火墙
一,selinux简介: SELinux(Security-Enhanced Linux)是一个Linux内核安全模块,旨在提供强制访问控制(MAC)机制,以增强系统的安全性。由美国国家安全局(NSA)开…...

业绩代码查询实战——php
一、一级代码显示职员 foreach($data_职员信息 as $key > $value){//$where_查询分类$where_查询通用;//$dat分类one $业绩提成->where($where_查询分类)->order("CreateDate desc")->select();if($value[haschildname]0 && $value[key] !"…...

内网穿透技术选型PPTP(点对点隧道协议)和 FRP(Fast Reverse Proxy)
PPTP(点对点隧道协议)和 FRP(Fast Reverse Proxy)是两种实现内网穿透的技术,但它们的工作原理、使用场景和特点有很大区别。以下是它们的详细比较: PPTP(Point-to-Point Tunneling Protocol&am…...