当前位置: 首页 > article >正文

快速排序_912. 排序数组(10中排序算法)

快速排序_912. 排序数组(10中排序算法)

  • 1 快速排序(重点)
    • 报错代码
    • 超时代码
    • 修改
    • 官方题解
    • 快速排序 1:基本快速排序
    • 快速排序 2:双指针(指针对撞)快速排序
    • 快速排序 3:三指针快速排序
  • 2 归并排序(重点)
  • 3 堆排序(堆很重要,堆排序根据个人情况掌握)
  • 4 插入排序(熟悉)
  • 5 选择排序(了解)
  • 6 冒泡排序(了解)
  • 7 计数排序(了解)
  • 8 基数排序(了解)
  • 9 桶排序(了解)
  • 10 希尔排序(不建议多花时间了解)

给你一个整数数组 nums,请你将该数组升序排列。
你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。

示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:
输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

1 快速排序(重点)

报错代码

class Solution {public int[] sortArray(int[] nums) {int temp = 0;int pivot = nums[0];int left = 0,right = nums.length-1;sortArray_nums(nums,left,right);}public int[] sortArray_nums(int[] nums,left,right) {while(left < right){while(nums[left]<=pivot){left++;}while(pivot<=nums[right]){right--;}temp = nums[left];nums[left] = nums[right];nums[right] = temp;left++;right--;}nums[left] = pivot;sortArray_nums(nums,0,left-1);sortArray_nums(nums,right+1,nums.length-1);return nums;}
}  我的快速排序是不是有问题

超时代码

class Solution {public int[] sortArray(int[] nums) {sortArray_nums(nums,0,nums.length-1);return nums;}public void sortArray_nums(int[] nums,int left,int right) {if(left>=right){return;}int l = left,r = right;int pivot = nums[left];int temp = 0;l++;while(l <= r){while(l <= r && nums[l]<=pivot){l++;}while(l <= r && pivot<=nums[r]){r--;}if(l <= r){temp = nums[l];nums[l] = nums[r];nums[r] = temp;l++;r--;}}nums[left] = nums[r];nums[r] = pivot;sortArray_nums(nums,left,r-1);sortArray_nums(nums,r+1,right);}private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}

修改

class Solution {public int[] sortArray(int[] nums) {sortArray_nums(nums,0,nums.length-1);return nums;}public void sortArray_nums(int[] nums,int left,int right) {if(left>=right){return;}int randomIndex = (left + right)/2;swap(nums, left, randomIndex);int l = left,r = right;int pivot = nums[left];l++;while(l <= r){while(l <= r && nums[l]<=pivot){l++;}while(l <= r && pivot<=nums[r]){r--;}if(l <= r){swap(nums, l, r);l++;r--;}}nums[left] = nums[r];nums[r] = pivot;sortArray_nums(nums,left,r-1);sortArray_nums(nums,r+1,right);}private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}

官方题解

class Solution {public int[] sortArray(int[] nums) {randomizedQuicksort(nums, 0, nums.length - 1);return nums;}public void randomizedQuicksort(int[] nums, int l, int r) {if (l < r) {int pos = randomizedPartition(nums, l, r);randomizedQuicksort(nums, l, pos - 1);randomizedQuicksort(nums, pos + 1, r);}}public int randomizedPartition(int[] nums, int l, int r) {int i = new Random().nextInt(r - l + 1) + l; // 随机选一个作为我们的主元swap(nums, r, i);return partition(nums, l, r);}public int partition(int[] nums, int l, int r) {int pivot = nums[r];int i = l - 1;for (int j = l; j <= r - 1; ++j) {if (nums[j] <= pivot) {i = i + 1;swap(nums, i, j);}}swap(nums, i + 1, r);return i + 1;}private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}

快速排序 1:基本快速排序

import java.util.Random;public class Solution {// 快速排序 1:基本快速排序/*** 列表大小等于或小于该大小,将优先于 quickSort 使用插入排序*/private static final int INSERTION_SORT_THRESHOLD = 7;private static final Random RANDOM = new Random();public int[] sortArray(int[] nums) {int len = nums.length;quickSort(nums, 0, len - 1);return nums;}private void quickSort(int[] nums, int left, int right) {// 小区间使用插入排序if (right - left <= INSERTION_SORT_THRESHOLD) {insertionSort(nums, left, right);return;}int pIndex = partition(nums, left, right);quickSort(nums, left, pIndex - 1);quickSort(nums, pIndex + 1, right);}/*** 对数组 nums 的子区间 [left, right] 使用插入排序** @param nums  给定数组* @param left  左边界,能取到* @param right 右边界,能取到*/private void insertionSort(int[] nums, int left, int right) {for (int i = left + 1; i <= right; i++) {int temp = nums[i];int j = i;while (j > left && nums[j - 1] > temp) {nums[j] = nums[j - 1];j--;}nums[j] = temp;}}private int partition(int[] nums, int left, int right) {int randomIndex = RANDOM.nextInt(right - left + 1) + left;swap(nums, left, randomIndex);// 基准值int pivot = nums[left];int lt = left;// 循环不变量:// all in [left + 1, lt] < pivot// all in [lt + 1, i) >= pivotfor (int i = left + 1; i <= right; i++) {if (nums[i] < pivot) {lt++;swap(nums, i, lt);}}swap(nums, left, lt);return lt;}private void swap(int[] nums, int index1, int index2) {int temp = nums[index1];nums[index1] = nums[index2];nums[index2] = temp;}
}

快速排序 2:双指针(指针对撞)快速排序

import java.util.Random;public class Solution {// 快速排序 2:双指针(指针对撞)快速排序/*** 列表大小等于或小于该大小,将优先于 quickSort 使用插入排序*/private static final int INSERTION_SORT_THRESHOLD = 7;private static final Random RANDOM = new Random();public int[] sortArray(int[] nums) {int len = nums.length;quickSort(nums, 0, len - 1);return nums;}private void quickSort(int[] nums, int left, int right) {// 小区间使用插入排序if (right - left <= INSERTION_SORT_THRESHOLD) {insertionSort(nums, left, right);return;}int pIndex = partition(nums, left, right);quickSort(nums, left, pIndex - 1);quickSort(nums, pIndex + 1, right);}/*** 对数组 nums 的子区间 [left, right] 使用插入排序** @param nums  给定数组* @param left  左边界,能取到* @param right 右边界,能取到*/private void insertionSort(int[] nums, int left, int right) {for (int i = left + 1; i <= right; i++) {int temp = nums[i];int j = i;while (j > left && nums[j - 1] > temp) {nums[j] = nums[j - 1];j--;}nums[j] = temp;}}private int partition(int[] nums, int left, int right) {int randomIndex = left + RANDOM.nextInt(right - left + 1);swap(nums, randomIndex, left);int pivot = nums[left];int lt = left + 1;int gt = right;// 循环不变量:// all in [left + 1, lt) <= pivot// all in (gt, right] >= pivotwhile (true) {while (lt <= right && nums[lt] < pivot) {lt++;}while (gt > left && nums[gt] > pivot) {gt--;}if (lt >= gt) {break;}// 细节:相等的元素通过交换,等概率分到数组的两边swap(nums, lt, gt);lt++;gt--;}swap(nums, left, gt);return gt;}private void swap(int[] nums, int index1, int index2) {int temp = nums[index1];nums[index1] = nums[index2];nums[index2] = temp;}
}

快速排序 3:三指针快速排序

import java.util.Random;public class Solution {// 快速排序 3:三指针快速排序/*** 列表大小等于或小于该大小,将优先于 quickSort 使用插入排序*/private static final int INSERTION_SORT_THRESHOLD = 7;private static final Random RANDOM = new Random();public int[] sortArray(int[] nums) {int len = nums.length;quickSort(nums, 0, len - 1);return nums;}private void quickSort(int[] nums, int left, int right) {// 小区间使用插入排序if (right - left <= INSERTION_SORT_THRESHOLD) {insertionSort(nums, left, right);return;}int randomIndex = left + RANDOM.nextInt(right - left + 1);swap(nums, randomIndex, left);// 循环不变量:// all in [left + 1, lt] < pivot// all in [lt + 1, i) = pivot// all in [gt, right] > pivotint pivot = nums[left];int lt = left;int gt = right + 1;int i = left + 1;while (i < gt) {if (nums[i] < pivot) {lt++;swap(nums, i, lt);i++;} else if (nums[i] == pivot) {i++;} else {gt--;swap(nums, i, gt);}}swap(nums, left, lt);// 注意这里,大大减少了两侧分治的区间quickSort(nums, left, lt - 1);quickSort(nums, gt, right);}/*** 对数组 nums 的子区间 [left, right] 使用插入排序** @param nums  给定数组* @param left  左边界,能取到* @param right 右边界,能取到*/private void insertionSort(int[] nums, int left, int right) {for (int i = left + 1; i <= right; i++) {int temp = nums[i];int j = i;while (j > left && nums[j - 1] > temp) {nums[j] = nums[j - 1];j--;}nums[j] = temp;}}private void swap(int[] nums, int index1, int index2) {int temp = nums[index1];nums[index1] = nums[index2];nums[index2] = temp;}
}

2 归并排序(重点)

public class Solution {// 归并排序/*** 列表大小等于或小于该大小,将优先于 mergeSort 使用插入排序*/private static final int INSERTION_SORT_THRESHOLD = 7;public int[] sortArray(int[] nums) {int len = nums.length;int[] temp = new int[len];mergeSort(nums, 0, len - 1, temp);return nums;}/*** 对数组 nums 的子区间 [left, right] 进行归并排序** @param nums* @param left* @param right* @param temp  用于合并两个有序数组的辅助数组,全局使用一份,避免多次创建和销毁*/private void mergeSort(int[] nums, int left, int right, int[] temp) {// 小区间使用插入排序if (right - left <= INSERTION_SORT_THRESHOLD) {insertionSort(nums, left, right);return;}int mid = left + (right - left) / 2;// Java 里有更优的写法,在 left 和 right 都是大整数时,即使溢出,结论依然正确// int mid = (left + right) >>> 1;mergeSort(nums, left, mid, temp);mergeSort(nums, mid + 1, right, temp);// 如果数组的这个子区间本身有序,无需合并if (nums[mid] <= nums[mid + 1]) {return;}mergeOfTwoSortedArray(nums, left, mid, right, temp);}/*** 对数组 arr 的子区间 [left, right] 使用插入排序** @param arr   给定数组* @param left  左边界,能取到* @param right 右边界,能取到*/private void insertionSort(int[] arr, int left, int right) {for (int i = left + 1; i <= right; i++) {int temp = arr[i];int j = i;while (j > left && arr[j - 1] > temp) {arr[j] = arr[j - 1];j--;}arr[j] = temp;}}/*** 合并两个有序数组:先把值复制到临时数组,再合并回去** @param nums* @param left* @param mid   [left, mid] 有序,[mid + 1, right] 有序* @param right* @param temp  全局使用的临时数组*/private void mergeOfTwoSortedArray(int[] nums, int left, int mid, int right, int[] temp) {System.arraycopy(nums, left, temp, left, right + 1 - left);int i = left;int j = mid + 1;for (int k = left; k <= right; k++) {if (i == mid + 1) {nums[k] = temp[j];j++;} else if (j == right + 1) {nums[k] = temp[i];i++;} else if (temp[i] <= temp[j]) {// 注意写成 < 就丢失了稳定性(相同元素原来靠前的排序以后依然靠前)nums[k] = temp[i];i++;} else {// temp[i] > temp[j]nums[k] = temp[j];j++;}}}
}

3 堆排序(堆很重要,堆排序根据个人情况掌握)

public class Solution {public int[] sortArray(int[] nums) {int len = nums.length;// 将数组整理成堆heapify(nums);// 循环不变量:区间 [0, i] 堆有序for (int i = len - 1; i >= 1; ) {// 把堆顶元素(当前最大)交换到数组末尾swap(nums, 0, i);// 逐步减少堆有序的部分i--;// 下标 0 位置下沉操作,使得区间 [0, i] 堆有序siftDown(nums, 0, i);}return nums;}/*** 将数组整理成堆(堆有序)** @param nums*/private void heapify(int[] nums) {int len = nums.length;// 只需要从 i = (len - 1) / 2 这个位置开始逐层下移for (int i = (len - 1) / 2; i >= 0; i--) {siftDown(nums, i, len - 1);}}/*** @param nums* @param k    当前下沉元素的下标* @param end  [0, end] 是 nums 的有效部分*/private void siftDown(int[] nums, int k, int end) {while (2 * k + 1 <= end) {int j = 2 * k + 1;if (j + 1 <= end && nums[j + 1] > nums[j]) {j++;}if (nums[j] > nums[k]) {swap(nums, j, k);} else {break;}k = j;}}private void swap(int[] nums, int index1, int index2) {int temp = nums[index1];nums[index1] = nums[index2];nums[index2] = temp;}
}

4 插入排序(熟悉)

public class Solution {// 插入排序:稳定排序,在接近有序的情况下,表现优异public int[] sortArray(int[] nums) {int len = nums.length;// 循环不变量:将 nums[i] 插入到区间 [0, i) 使之成为有序数组for (int i = 1; i < len; i++) {// 先暂存这个元素,然后之前元素逐个后移,留出空位int temp = nums[i];int j = i;// 注意边界 j > 0while (j > 0 && nums[j - 1] > temp) {nums[j] = nums[j - 1];j--;}nums[j] = temp;}return nums;}
}

5 选择排序(了解)

import java.util.Arrays;public class Solution {// 选择排序:每一轮选择最小元素交换到未排定部分的开头public int[] sortArray(int[] nums) {int len = nums.length;// 循环不变量:[0, i) 有序,且该区间里所有元素就是最终排定的样子for (int i = 0; i < len - 1; i++) {// 选择区间 [i, len - 1] 里最小的元素的索引,交换到下标 iint minIndex = i;for (int j = i + 1; j < len; j++) {if (nums[j] < nums[minIndex]) {minIndex = j;}}swap(nums, i, minIndex);}return nums;}private void swap(int[] nums, int index1, int index2) {int temp = nums[index1];nums[index1] = nums[index2];nums[index2] = temp;}public static void main(String[] args) {int[] nums = {5, 2, 3, 1};Solution solution = new Solution();int[] res = solution.sortArray(nums);System.out.println(Arrays.toString(res));}
}

6 冒泡排序(了解)

public class Solution {// 冒泡排序:超时public int[] sortArray(int[] nums) {int len = nums.length;for (int i = len - 1; i >= 0; i--) {// 先默认数组是有序的,只要发生一次交换,就必须进行下一轮比较,// 如果在内层循环中,都没有执行一次交换操作,说明此时数组已经是升序数组boolean sorted = true;for (int j = 0; j < i; j++) {if (nums[j] > nums[j + 1]) {swap(nums, j, j + 1);sorted = false;}}if (sorted) {break;}}return nums;}private void swap(int[] nums, int index1, int index2) {int temp = nums[index1];nums[index1] = nums[index2];nums[index2] = temp;}
}

7 计数排序(了解)

public class Solution {// 计数排序private static final int OFFSET = 50000;public int[] sortArray(int[] nums) {int len = nums.length;// 由于 -50000 <= A[i] <= 50000// 因此"桶" 的大小为 50000 - (-50000) = 10_0000// 并且设置偏移 OFFSET = 50000,目的是让每一个数都能够大于等于 0// 这样就可以作为 count 数组的下标,查询这个数的计数int size = 10_0000;// 计数数组int[] count = new int[size];// 计算计数数组for (int num : nums) {count[num + OFFSET]++;}// 把 count 数组变成前缀和数组for (int i = 1; i < size; i++) {count[i] += count[i - 1];}// 先把原始数组赋值到一个临时数组里,然后回写数据int[] temp = new int[len];System.arraycopy(nums, 0, temp, 0, len);// 为了保证稳定性,从后向前赋值for (int i = len - 1; i >= 0; i--) {int index = count[temp[i] + OFFSET] - 1;nums[index] = temp[i];count[temp[i] + OFFSET]--;}return nums;}
}

8 基数排序(了解)

public class Solution {// 基数排序:低位优先private static final int OFFSET = 50000;public int[] sortArray(int[] nums) {int len = nums.length;// 预处理,让所有的数都大于等于 0,这样才可以使用基数排序for (int i = 0; i < len; i++) {nums[i] += OFFSET;}// 第 1 步:找出最大的数字int max = nums[0];for (int num : nums) {if (num > max) {max = num;}}// 第 2 步:计算出最大的数字有几位,这个数值决定了我们要将整个数组看几遍int maxLen = getMaxLen(max);// 计数排序需要使用的计数数组和临时数组int[] count = new int[10];int[] temp = new int[len];// 表征关键字的量:除数// 1 表示按照个位关键字排序// 10 表示按照十位关键字排序// 100 表示按照百位关键字排序// 1000 表示按照千位关键字排序int divisor = 1;// 有几位数,外层循环就得执行几次for (int i = 0; i < maxLen; i++) {// 每一步都使用计数排序,保证排序结果是稳定的// 这一步需要额外空间保存结果集,因此把结果保存在 temp 中countingSort(nums, temp, divisor, len, count);// 交换 nums 和 temp 的引用,下一轮还是按照 nums 做计数排序int[] t = nums;nums = temp;temp = t;// divisor 自增,表示采用低位优先的基数排序divisor *= 10;}int[] res = new int[len];for (int i = 0; i < len; i++) {res[i] = nums[i] - OFFSET;}return res;}private void countingSort(int[] nums, int[] res, int divisor, int len, int[] count) {// 1、计算计数数组for (int i = 0; i < len; i++) {// 计算数位上的数是几,先取个位,再十位、百位int remainder = (nums[i] / divisor) % 10;count[remainder]++;}// 2、变成前缀和数组for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}// 3、从后向前赋值for (int i = len - 1; i >= 0; i--) {int remainder = (nums[i] / divisor) % 10;int index = count[remainder] - 1;res[index] = nums[i];count[remainder]--;}// 4、count 数组需要设置为 0 ,以免干扰下一次排序使用for (int i = 0; i < 10; i++) {count[i] = 0;}}/*** 获取一个整数的最大位数** @param num* @return*/private int getMaxLen(int num) {int maxLen = 0;while (num > 0) {num /= 10;maxLen++;}return maxLen;}
}

9 桶排序(了解)

public class Solution {// 桶排序// 1 <= A.length <= 10000// -50000 <= A[i] <= 50000// 10_0000private static final int OFFSET = 50000;public int[] sortArray(int[] nums) {int len = nums.length;// 第 1 步:将数据转换为 [0, 10_0000] 区间里的数for (int i = 0; i < len; i++) {nums[i] += OFFSET;}// 第 2 步:观察数据,设置桶的个数// 步长:步长如果设置成 10 会超出内存限制int step = 1000;// 桶的个数int bucketLen = 10_0000 / step;int[][] temp = new int[bucketLen + 1][len];int[] next = new int[bucketLen + 1];// 第 3 步:分桶for (int num : nums) {int bucketIndex = num / step;temp[bucketIndex][next[bucketIndex]] = num;next[bucketIndex]++;}// 第 4 步:对于每个桶执行插入排序for (int i = 0; i < bucketLen + 1; i++) {insertionSort(temp[i], next[i] - 1);}// 第 5 步:从桶里依次取出来int[] res = new int[len];int index = 0;for (int i = 0; i < bucketLen + 1; i++) {int curLen = next[i];for (int j = 0; j < curLen; j++) {res[index] = temp[i][j] - OFFSET;index++;}}return res;}private void insertionSort(int[] arr, int endIndex) {for (int i = 1; i <= endIndex; i++) {int temp = arr[i];int j = i;while (j > 0 && arr[j - 1] > temp) {arr[j] = arr[j - 1];j--;}arr[j] = temp;}}
}

10 希尔排序(不建议多花时间了解)

public class Solution {// 希尔排序public int[] sortArray(int[] nums) {int len = nums.length;int h = 1;// 使用 Knuth 增量序列// 找增量的最大值while (3 * h + 1 < len) {h = 3 * h + 1;}while (h >= 1) {// insertion sortfor (int i = h; i < len; i++) {insertionForDelta(nums, h, i);}h = h / 3;}return nums;}/*** 将 nums[i] 插入到对应分组的正确位置上,其实就是将原来 1 的部分改成 gap** @param nums* @param gap* @param i*/private void insertionForDelta(int[] nums, int gap, int i) {int temp = nums[i];int j = i;// 注意:这里 j >= deta 的原因while (j >= gap && nums[j - gap] > temp) {nums[j] = nums[j - gap];j -= gap;}nums[j] = temp;}
}

相关文章:

快速排序_912. 排序数组(10中排序算法)

快速排序_912. 排序数组&#xff08;10中排序算法&#xff09; 1 快速排序&#xff08;重点&#xff09;报错代码超时代码修改官方题解快速排序 1&#xff1a;基本快速排序快速排序 2&#xff1a;双指针&#xff08;指针对撞&#xff09;快速排序快速排序 3&#xff1a;三指针快…...

DEMF模型赋能多模态图像融合,助力肺癌高效分类

目录 论文创新点 实验设计 1. 可视化的研究设计 2. 样本选取和数据处理 3. 集成分类模型 4. 实验结果 5. 可视化结果 图表总结 可视化知识图谱 在肺癌早期筛查中,计算机断层扫描(CT)和正电子发射断层扫描(PET)作为两种关键的影像学手段,分别提供了丰富的解剖结构…...

Linux-CentOS 7安装

Centos 7镜像&#xff1a;https://pan.baidu.com/s/1fkQHYT64RMFRGLZy1xnSWw 提取码: q2w2 VMware Workstation&#xff1a;https://pan.baidu.com/s/1JnRcDBIIOWGf6FnGY_0LgA 提取码: w2e2 1、打开vmware workstation 2、选择主界面的"创建新的虚拟机"或者点击左上…...

Android14(13)添加墨水屏手写API

软件平台&#xff1a;Android14 硬件平台&#xff1a;QCS6115 需求&#xff1a;特殊品类的产品墨水屏实现手写的功能&#xff0c;本来Android自带的Input这一套可以实现实时展示笔迹&#xff0c;但是由于墨水屏特性&#xff0c;达不到正常的彩屏刷新的帧率&#xff0c;因此使用…...

AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践

清华大学出品《DeepSeek&#xff1a;从入门到精通》分享 在忙碌的职场中&#xff0c;制作一份高质量的PPT往往需要投入大量时间和精力&#xff0c;尤其是在临近截止日期时。今天&#xff0c;我们将探索如何借助 AI 工具 —— DeepSeek 和 Kimi —— 让 PPT 制作变得既快捷又高…...

【opencv】图像基本操作

一.计算机眼中的图像 1.1 图像读取 cv2.IMREAD_COLOR&#xff1a;彩色图像 cv2.IMREAD_GRAYSCCALE&#xff1a;灰色图像 ①导包 import cv2 # opencv读取的格式是BGR import matplotlib.pyplot as plt import numpy as np %matplotlib inline ②读取图像 img cv2.imread(…...

帆软报表FineReport入门:简单报表制作[扩展|左父格|上父格]

FineReport帮助文档 - 全面的报表使用教程和学习资料 数据库连接 点击号>>JDBC 选择要连接的数据库>>填写信息>>点击测试连接 数据库SQLite是帆软的内置数据库, 里面有练习数据 选择此数据库后,点击测试连接即可 数据库查询 方法一: 在左下角的模板数据集…...

云手机如何进行经纬度修改

云手机如何进行经纬度修改 云手机修改经纬度的方法因不同服务商和操作方式有所差异&#xff0c;以下是综合多个来源的常用方法及注意事项&#xff1a; 通过ADB命令注入GPS数据&#xff08;适用于技术用户&#xff09; 1.连接云手机 使用ADB工具连接云手机服务器&#xff0c;…...

VUE中的组件加载方式

加载方式有哪些&#xff0c;及如何进行选择 常规的静态引入是在组件初始化时就加载所有依赖的组件&#xff0c;而懒加载则是等到组件需要被渲染的时候才加载。 对于大型应用&#xff0c;可能会有很多组件&#xff0c;如果一开始都加载&#xff0c;可能会影响首屏加载时间。如…...

天 锐 蓝盾终端安全管理系统:办公U盘拷贝使用管控限制

天 锐 蓝盾终端安全管理系统以终端安全为基石&#xff0c;深度融合安全、管理与维护三大要素&#xff0c;通过对桌面终端系统的精准把控&#xff0c;助力企业用户构筑起更为安全、稳固且可靠的网络运行环境。它实现了管理的标准化&#xff0c;有效破解终端安全管理难题&#xf…...

计算机网络之物理层——基于《计算机网络》谢希仁第八版

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…...

区块链中的递归长度前缀(RLP)序列化详解

文章目录 1. 什么是RLP序列化&#xff1f;2. RLP的设计目标与优势3. RLP处理的数据类型4. RLP编码规则详解字符串的编码规则列表的编码规则 5. RLP解码原理6. RLP在以太坊中的应用场景7. 编码示例分析8. 总结 1. 什么是RLP序列化&#xff1f; 递归长度前缀&#xff08;RLP&…...

分布式简单理解

基本概念 应⽤(Application)/系统&#xff08;System&#xff09; 为了完成⼀整套服务的⼀个程序或者⼀组相互配合的程序群。⽣活例⼦类⽐&#xff1a;为了完成⼀项任 务&#xff0c;⽽搭建的由⼀个⼈或者⼀群相互配的⼈组成的团队。 模块&#xff08;Module&#xff09;/组件…...

记录:Docker 安装记录

今天在安装 ollama 时发现无法指定安装目录&#xff0c;而且它的命令行反馈内容很像 docker &#xff0c;而且它下载的模型也是放在 C 盘&#xff0c;那么如果我 C 盘空间不足&#xff0c;就装不了 deepseek-r1:70b &#xff0c;于是想起来之前安装 Docker 的时候也遇到过类似问…...

Leetcode 二叉树展开为链表

java solution class Solution {public void flatten(TreeNode root) {//首先设置递归终止条件if(root null) return;//分别递归处理左右子树&#xff0c;//递归需要先处理子问题&#xff08;子树的拉平&#xff09;&#xff0c;然后才能处理当前问题&#xff08;当前节点的指…...

IEEE官方期刊缩写查询pdf分享

可以直接保存...

RabbitMQ 消息队列 优化发送邮件

express 发送邮件 最简单的异步发送邮件方法为何要使用 RabbitMQ&#xff1f;如何在 Node 项目中集成 RabbitMQ&#xff1f; 一、 不用 await 发送邮件 在实际开发之前&#xff0c;不妨先思考下&#xff0c;我们最终的目的是为了让邮件异步发送。那发送邮件这里有个await&am…...

【AI】常见的AI工具地址和学习资料链接

AI工具地址&#xff1a; DeepSeek&#xff1a;DeepSeekChatGPT-4o&#xff1a;https://openai.com/chatgpt/overview/Kimi&#xff1a;Kimi.ai - 会推理解析&#xff0c;能深度思考的AI助手豆包&#xff1a;豆包讯飞星火&#xff1a;讯飞星火大模型-AI大语言模型-星火大模型-科…...

NetLogon 权限提升漏洞

参考文章&#xff1a;CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客 域控机器账户&#xff1a;WIN-0V0GAORDC17 域控 ip&#xff1a;192.168.72.163 域内攻击者机器 ip&#xff1a;192.168.72.158&#xff0c;host&#xff1a;WIN10-01 攻击者 kali…...

【C++】 Flow of Control

《C程序设计基础教程》——刘厚泉&#xff0c;李政伟&#xff0c;二零一三年九月版&#xff0c;学习笔记 文章目录 1、选择结构1.1、if 语句1.2、嵌套的 if 语句1.3、条件运算符 ?:1.4、switch 语句 2、循环结构2.1、while 语句2.2、do-while 语句2.3、 for 循环2.4、循环嵌套…...

图论 之 迪斯科特拉算法求解最短路径

文章目录 题目743.网络延迟时间3341.到达最后一个房间的最少时间I 求解最短路径的问题&#xff0c;分为使用BFS和使用迪斯科特拉算法&#xff0c;这两种算法求解的范围是有区别的 BFS适合求解&#xff0c;边的权值都是1的图中的最短路径的问题 图论 之 BFS迪斯科特拉算法适合求…...

module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法

module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法 pip install opencv-python4.7.0.72 -i https://pypi.tuna.tsinghua.edu.cn/simple 测试&#xff1a; python -c"import cv2"...

Spring Boot 中事务的用法详解

引言 在 Spring Boot 中&#xff0c;事务管理是一个非常重要的功能&#xff0c;尤其是在涉及数据库操作的业务场景中。Spring 提供了强大的事务管理支持&#xff0c;能够帮助我们简化事务的管理和控制。本文将详细介绍 Spring Boot 中事务的用法&#xff0c;包括事务的基本概…...

【react18】如何使用useReducer和useContext来实现一个todoList功能

重点知识点就是使用useReducer来攻坚小型的公共状态管理&#xff0c;useImmerReducer来实现数据的不可变 实现效果 实现代码 项目工程结构 App.js文件 import logo from "./logo.svg"; import "./App.css"; import TodoLists from "./comps/TodoLi…...

Android GreenDAO 适配 AGP 8.0+

在 Android 中使用 GreenDao&#xff0c;由于 GreenDao 现在不维护&#xff0c;所以更新到新版本的 Gradle 经常出问题&#xff0c;在这记录一些升级遇到的问题&#xff0c;并且记录解决方案。 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539687357 一、‘:app…...

一篇搞懂vue3中如何使用ref、reactive实现响应式数据

ref 可实现 基本类型、对象类型响应式数据 reactive&#xff1a;只能实现 对象类型响应式 ref实现 基本类型 数据响应式&#xff1a; <template><div class"person"><h2>姓名&#xff1a;{{ name }}</h2><h2>年龄&#xff1a;{{ ag…...

【HeadFirst系列之HeadFirst设计模式】第7天之命令模式:封装请求,轻松实现解耦!

命令模式&#xff1a;封装请求&#xff0c;轻松实现解耦&#xff01; 大家好&#xff01;今天我们来聊聊设计模式中的命令模式&#xff08;Command Pattern&#xff09;。如果你曾经需要将请求封装成对象&#xff0c;或者希望实现请求的撤销、重做等功能&#xff0c;那么命令模…...

简单封装一个websocket构造函数

问题描述 最近维护一个老项目&#xff0c;发现项目中有大量重复代码&#xff0c;特别是websocket的调用这一块&#xff0c;同样的代码复制了十几个页面&#xff0c;于是自己封装了一个websocket调用的构造函数。 export default class CreateWebSocket {constructor(url) {//…...

Linux-Ansible自动化运维

文章目录 自动化运维Ansible &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Linux专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年02月21日17点38分 自动化运维 自动化运维常用工具 Ansible 和 SaltStack 自动化运维优势&#xff1a; 服…...

uni-app(位置1)

文章目录 一、获取当前的地理位置、速度 uni.getLocation(OBJECT)二、打开地图选择位置 uni.chooseLocation(OBJECT)三、使用应用内置地图查看位置。uni.openLocation(OBJECT) 一、获取当前的地理位置、速度 uni.getLocation(OBJECT) App平台 manifest中配置好自己的地图厂商k…...