快速排序_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. 排序数组(10中排序算法) 1 快速排序(重点)报错代码超时代码修改官方题解快速排序 1:基本快速排序快速排序 2:双指针(指针对撞)快速排序快速排序 3:三指针快…...
BS5852英国家具防火安全条款主要包括哪几个方面呢?
什么是BS5852检测? BS5852是英国针对家用家具的强制性安全要求,主要测试家具在受到燃烧香烟和火柴等火源时的可燃性。这个标准通常分为四个部分进行测试,但实际应用中主要测试第一部分和第二部分,包括烟头测试和利用乙炔火焰模拟…...
高考或者单招考试需要考物理这科目
问题:帮忙搜索一下以上学校哪些高考或者单招考试需要考物理这科目的 回答: 根据目前获取的资料,明确提及高考或单招考试需考物理的学校为湖南工业职业技术学院,在部分专业单招时要求选考物理;其他学校暂未发现明确提…...
基于vue3实现的课堂点名程序
设计思路 采用vue3实现的课堂点名程序,模拟课堂座位布局,点击开始点名按钮后,一朵鲜花在座位间传递,直到点击结束点名按钮,鲜花停留的座位被点名。 课堂点名 座位组件 seat.vue <script setup>//组合式APIimpo…...
压力传感器
压力传感器是一种用于测量气体或液体压力的设备,广泛应用于工业控制、汽车电子、医疗设备、航空航天等领域。以下是关于压力传感器的详细介绍: 一、压力传感器的分类 1. 按测量原理分类 - 压阻式压力传感器: - 原理:利用压…...
Django REST Framework (DRF) 中用于构建 API 视图类解析
Django REST Framework (DRF) 提供了丰富的视图类,用于构建 API 视图。这些视图类可以分为以下几类: 1. 基础视图类 这些是 DRF 中最基础的视图类,通常用于实现自定义逻辑。 常用类 APIView: 最基本的视图类,所有其…...
DeepSeek介绍[Cache-Through、Cache-Around、Cache-Behind、Cache-Asid]
Cache-Through、Cache-Around、Cache-Behind和Cache-Aside是几种常见的缓存策略,每种策略有其独特的工作机制和应用场景。以下是对这些缓存模式的详细介绍: 1. Cache-Through 工作原理: 读操作:应用程序首先向缓存层请求数据。…...
React 前端框架介绍
什么是 React? React 是一个由 Facebook 开发并维护的开源 JavaScript 库,用于构建用户界面。它主要用于创建交互式用户界Face(UI),尤其是当数据变化时需要更新部分视图时非常有效。React 的核心思想是组件化和声明性…...
自制简单的图片查看器(python)
图片格式:支持常见的图片格式(JPG、PNG、BMP、GIF)。 import os import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTkclass ImageViewer:def __init__(self, root):self.root rootself.root.…...
基于Electron+Vue3创建桌面应用
Electron 是一个开源框架,基于 Chromium 和 Node.js,用于开发跨平台桌面应用程序。它允许开发者使用 HTML、CSS 和 JavaScript 等 Web 技术构建原生桌面应用,支持 Windows、macOS 和 Linux。Electron 以其开发便捷性、强大的功能和丰富的生态系统而广泛应用于工具类应用、媒…...
Redis实战-扩展Redis
扩展Redis 1、扩展读性能2、扩展写性能和内存容量3、扩展复杂的查询3.1 扩展联合查询3.2 扩展分片排序 如有侵权,请联系~ 如有错误,也欢迎批评指正~ 本篇文章大部分是来自学习《Redis实战》的笔记 1、扩展读性能 单台Redis服务器…...
Vue 前端开发中的路由知识:从入门到精通
文章目录 引言1. Vue Router 简介1.1 安装 Vue Router1.2 配置 Vue Router1.3 在 Vue 实例中使用 Vue Router 2. 路由的基本用法2.1 路由映射2.2 路由视图2.3 路由链接 3. 动态路由3.1 动态路径参数3.2 访问动态参数3.3 响应路由参数的变化 4. 嵌套路由4.1 定义嵌套路由4.2 渲染…...
为AI聊天工具添加一个知识系统 之109 详细设计之50 三性三量三境
本文要点 纵观整个讨论过程 最初我提“相得益彰的三性(三性) 相提并论的三者(三量) 相映成趣的三化(三境)” “ 确定 今天的讨论题-- “我”的知识树:相得益彰的三性(即 三性&…...
51-ArrayList
51-ArrayList Collection 类型介绍 仓颉中常用的几种基础 Collection 类型,包含 Array、ArrayList、HashSet、HashMap。 可以在不同的场景中选择适合对应业务的类型: Array:如果不需要增加和删除元素,但需要修改元素ÿ…...
工业制造能耗管理新突破,漫途MTIC-ECM平台助力企业绿色转型!
在工业制造领域,能源消耗一直是企业运营成本的重要组成部分。随着“双碳”目标的推进,如何实现高效能耗管理,成为制造企业亟待解决的问题。漫途MTIC-ECM能源能耗在线监测平台,结合其自研的硬件产品,为工业制造企业提供…...
sql注入之python脚本进行时间盲注和布尔盲注
一、什么是时间盲注和布尔盲注? 答:时间盲注是攻击者通过构造恶意sql语句利用sleep()等延迟函数来观察数据库响应时间差异来进行推断信息和条件判断。如果条件为真,数据库会执行延时操作,如果为假则立即返回。响应时间较短。 SELE…...
map的使用(c++)
在了解map之前,我们先看看两个场景,通过这两个场景的对比,让我们知道为什么要存在存储双关键字的容器 场景一:判断一堆字符串中,某一个字符串是否出现过 在没学set容器之前,我们只能想到把这一堆字符串存到…...
Android13-包安装器PackageInstaller-之apk安装流程
目的 我们最终是为了搞明白安装的整个流程通过安卓系统自带的包安装器来了解PMS 安装流程实现需求定制:静默安装-安装界面定制-安装拦截验证。【核心目的】 安装流程和PMS了解不用多说了; 安装定制相关: 如 手机上安装时候弹出锁屏界面需要输入密码;安…...
前端函数在开发环境与生产环境中处理空字符串的差异及解决方案
在前端开发过程中,我们经常会遇到一些函数在开发环境中运行正常,但在生产环境中却出现报错的情况。本文将通过具体的代码示例和分析,探讨一个函数在开发环境和生产环境中处理空字符串的差异,并提供解决方案。 1. 问题描述 我们有…...
数智读书笔记系列014 MICK《SQL进阶教程》第一版和第二版对比和总结
引言 在当今数字化时代,数据已成为企业和组织的核心资产之一。而 SQL(Structured Query Language)作为管理和操作关系型数据库的标准语言,其重要性不言而喻。无论是数据查询、插入、更新还是删除,SQL 都能高效地完成任务,广泛应用于数据分析、数据挖掘、数据仓库、Web 开…...
智能猫眼实现流程图
物理端开发流程图 客户端端开发流程图 用户功能开发流程图 管理员开发流程图...
docker安装kafka,并通过springboot快速集成kafka
目录 一、docker安装和配置Kafka 1.拉取 Zookeeper 的 Docker 镜像 2.运行 Zookeeper 容器 3.拉取 Kafka 的 Docker 镜像 4.运行 Kafka 容器 5.下载 Kafdrop 6.运行 Kafdrop 7.如果docker pull wurstmeister/zookeeper或docker pull wurstmeister/kafka下载很慢&#x…...
Spring Boot 中自动装配机制的原理
Spring Boot 的自动装配机制是其核心特性之一,它简化了 Spring 应用的配置,让开发者能够快速构建应用。以下是对其原理的详细总结: 1. 核心概念 自动装配 (Auto-configuration): Spring Boot 根据应用依赖和配置,自动配置 Spring…...
python继承中super() 不是简单的“调用父类”,而是调用 MRO 里的下一个类
Python 里的一个类可以同时继承多个父类。这让我们的模型设计变得更灵 活,但同时也带来一个新问题:“在复杂的继承关系下,如何确认子类的 某个方法会用到哪个父类?” 这里有点需要理解: MRO(方法解析顺序…...
【智慧校园】分体空调节能监管:打造高效节能的学习环境
随着科技的飞速发展和生活品质的不断提升,人们对于家居和办公环境的舒适度与智能化要求也越来越高。分体空调集中控制系统作为一种先进的空调管理方式,正逐渐成为现代家庭和办公场所的标配,为用户带来更加便捷、高效和节能的空调使用体验。随…...
【达梦数据库】dblink连接[SqlServer/Mysql]报错处理
目录 背景问题1:无法测试以ODBC数据源方式访问的外部链接!问题分析&原因解决方法 问题2:DBLINK连接丢失问题分析&原因解决方法 问题3:DBIINK远程服务器获取对象[xxx]失败,错误洋情[[FreeTDS][SQL Server]Could not find stored proce…...
STM32 ADC介绍(硬件原理篇)
目录 背景 AD转换器 采样与保持 量化 编码 AD转换器转换原理 DA转换原理 AD转换原理 1.逐次逼近型AD转换器 2.并联比较型AD转换器 编码器 同步D触发器和边沿D触发器 基本RS触发器 同步RS触发器 同步D触发器 边沿型D触发器(维持-阻塞D触发器ÿ…...
蚁剑(AutSword)的下载安装与报错解决
蚁剑(AutSword)的下载安装与报错解决 1.下载 唯一官方github下载地址 GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器 2.安装 打开并且进入到下面的界面 下载需要的的版本 进行初始化 3.报错 出现下面的报错 4.解决方法 出现上面报错…...
BT401双模音频蓝牙模块如何开启ble的透传,有什么注意事项
BT401音频蓝牙模块如何开启ble的透传? 首先BT401的蓝牙音频模块,分为两个版本,dac版本和iis数字音频版本 DAC版本:就是BT401蓝牙模块【9和10脚】直接输出模拟音频信号,也就是说,直接推动耳机可以听到声音 …...
209. 长度最小的子数组
这个题目之前做过是用c语言写的 但是我这里用python来写 写的不是很好 感觉自己这里写的还是有问题 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,…...
使用IDEA创建Maven项目、Maven坐标,以及导入Maven项目
一、创建Maven项目 正如使用Vue创建工程化的前端项目,此时,使用Maven创建标准化的后端项目。 以下适用于2021版本的IDEA。 name和artifactid会自动保持一致。 Groupid:一般写公司域名倒写,再加上项目名(也可以不…...
从零到一实现微信小程序计划时钟:完整教程
在本教程中,我们将一起实现一个微信小程序——计划时钟。这个小程序的核心功能是帮助用户添加任务、设置任务的时间范围,并且能够删除和查看已添加的任务。通过以下步骤,我们将带你从零开始实现一个具有基本功能的微信小程序计划时钟。 项目…...
最长回文子串(蓝桥云课)
题目链接:8.最长回文子串 - 蓝桥云课 (lanqiao.cn) 代码如下 # include <iostream> # include <cstring> using namespace std; int main() {string str;getline(cin, str);int res 0;for(int i 0; i < str.length(); i){int l i - 1, r i 1;…...
12-滑动窗口
一,定义 滑动窗口算法是一种用于处理数组或字符串问题的技巧,特别适合解决涉及子数组或子串的问题。它的核心思想是通过维护一个“窗口”来高效地计算或查找满足条件的子数组或子串。 基本概念 窗口:窗口是数组或字符串中的一个连续子区间&a…...
时间序列分析(五)——移动平均模型(MA模型)
此前篇章: 时间序列分析(一)——基础概念篇 时间序列分析(二)——平稳性检验 时间序列分析(三)——白噪声检验 时间序列分析(四)——差分运算、延迟算子、AR(p)模型 …...
eNSP防火墙综合实验
一、实验拓扑 二、ip和安全区域配置 1、防火墙ip和安全区域配置 新建两个安全区域 ip配置 Client1 Client2 电信DNS 百度web-1 联通DNS 百度web-2 R2 R1 三、DNS透明代理相关配置 1、导入运营商地址库 2、新建链路接口 3、配置真实DNS服务器 4、创建虚拟DNS服务器 5、配置D…...
ES8字符串填充用法总结:padStart(),padEnd(),rest剩余参数的用法{name,...obj},扩展运算符的用法,正则表达式命名捕获组
ES8(ECMAScript 2017)引入了两个非常有用的字符串填充方法:padStart() 和 padEnd(),它们可以用来在字符串的两端添加指定的填充字符,从而达到指定的字符串长度。这些方法非常适合用于格式化文本和对齐输出。 1. padSt…...
Redis 统计每个数据类型中占用内存最多的前 N 个 bigkey
Redis 统计每个数据类型中占用内存最多的前 N 个 bigkey import redisdef find_bigkeys(hostlocalhost, port6379, db0, n10):r redis.Redis(hosthost, portport, db0)bigkeys {}# 用于存储每种数据类型的键及内存占用type_memory_dict {}# 扫描所有键for key in r.scan_it…...
C++中的.*运算符
看运算符重载的时候,看到这一句 .* :: sizeof ?: . 注意以上5个运算符不能重载。 :: sizeof ?: . 这四个好理解,毕竟都学过,但.*是什么? 于是自己整理了一下 .* 是一种 C 中的运算符,称为指针到成…...
大语言模型简史:从Transformer(2017)到DeepSeek-R1(2025)的进化之路
2025年初,中国推出了具有开创性且高性价比的「大型语言模型」(Large Language Model — LLM)DeepSeek-R1,引发了AI的巨大变革。本文回顾了LLM的发展历程,起点是2017年革命性的Transformer架构,该架构通过「…...
14-H指数
给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发…...
Param ‘serviceName‘ is illegal, serviceName is blank
今天测试nacos服务配置拉取时报了这样一个错误,发现是spring.application.name空值造成的,但是我的bootstrap.yml文件明明配置了,难不成是没有加载bootstrap.yml文件?于是我引入了下面的依赖 <dependency><groupId>o…...
深入剖析Spring MVC
一、Spring MVC 概述 1. 什么是 Spring MVC? Spring MVC 是基于 Spring 框架的 Web 框架,它实现了 MVC 设计模式,将应用程序分为三个核心部分: Model:封装应用程序的数据和业务逻辑。 View:负责渲染数据…...
LLM:RAG
原文链接:LLM:RAG 1、RAG 概览 RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合了信息检索(IR)和 LLM 的技术。它的核心思想是在 LLM 生成回答之前,通过检索相关文档…...
Linux 信号量
Linux 信号量 一、信号量基础概念1.1 同步机制的核心需求1.2 信号量的核心原理1.3 信号量类型对比 二、实战代码解析2.1 共享内存与信号量结合示例2.2 信号量类实现要点 三、关键实现细节分析3.1 初始化三步骤3.2 SEM_UNDO机制3.3 原子操作保证 四、进阶应用场景4.1 生产者-消费…...
如何优化Spark作业的性能
优化Spark作业的性能是一个综合性的任务,涉及多个方面的调整和优化。以下是一些关键的优化策略: 一、开发调优 避免创建重复的RDD: 对于同一份数据,只应该创建一个RDD,避免多次创建RDD来增加性能开销。在对不同的数据…...
ERP对制造业务有何价值?
ERP 的定义 在定义 ERP 之前,我们先从其首字母缩写说起,ERP 代表企业资源规划。我们可以将 ERP 定义为一种企业软件,它帮助组织管理日常业务。从根本上讲,ERP 将客户管理、人力资源、商业智能、财务管理、库存以及供应链功能整合…...
python和pycharm 和Anaconda的关系
好的,下面我会详细说明 Python、PyCharm 和 Anaconda 三者的关系,并逐一解释它们的功能和作用。 1. Python(编程语言) 定义:Python 是一种高级编程语言,设计简洁,易于学习,且功能强…...
网络安全“挂图作战“及其场景
文章目录 一、网络安全挂图作战来源与定义1、网络安全挂图作战的来源2、网络安全挂图作战的定义 二、挂图作战关键技术三、挂图作战与传统态势感知的差异四、挂图作战主要场景五、未来趋势结语 一、网络安全挂图作战来源与定义 1、网络安全挂图作战的来源 网络安全挂图作战的…...
【对比】Pandas 和 Polars 的区别
Pandas vs Polars 对比表 特性PandasPolars开发语言Python(Cython 实现核心部分)Rust(高性能系统编程语言)性能较慢,尤其在大数据集上(内存占用高,计算效率低)极快,利用…...