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

Java面试黄金宝典16

1. 各种排序算法的时间复杂度和空间复杂度

冒泡排序

  • 定义
    冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢 “浮” 到数列的顶端。
  • 要点
    1. 每一轮比较都会将最大(或最小)的元素 “浮” 到数列的末尾。
    2. 比较相邻的元素,如果顺序错误就把它们交换过来。
  • 时间复杂度
    • 最好情况:O(n)。当数列已经有序时,只需遍历一次,不需要进行交换操作。
    • 最坏情况和平均情况:O(n2)。因为需要进行两层嵌套循环,对于长度为 n 的数列,比较次数约为 n(n−1)/2。
  • 空间复杂度:O(1)。只需要常数级的额外空间,用于交换元素时的临时变量。
  • 应用
    可以通过设置标志位来优化冒泡排序。当某一轮没有发生交换时,说明数列已经有序,提前结束排序。以下是优化后的代码示例:

java

public class OptimizedBubbleSort {public static void bubbleSort(int[] arr) {int n = arr.length;boolean swapped;for (int i = 0; i < n - 1; i++) {swapped = false;for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换 arr[j+1] 和 arr[j]int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;swapped = true;}}// 如果没有发生交换,说明数组已经有序if (!swapped) {break;}}}public static void main(String[] args) {int[] arr = {64, 34, 25, 12, 22, 11, 90};bubbleSort(arr);for (int num : arr) {System.out.print(num + " ");}}
}

选择排序

  • 定义
    选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
  • 要点
    • 每次选择最小(或最大)的元素进行交换。
    • 从未排序序列中找到最小(或最大)元素,与未排序序列的第一个元素交换。
  • 时间复杂度:最好、最坏和平均情况都是 O(n2)。因为无论数列初始状态如何,都需要进行两层嵌套循环来选择最小(或最大)元素。
  • 空间复杂度:O(1)。只需要常数级的额外空间,用于交换元素时的临时变量。
  • 应用
    可以考虑使用堆来优化选择排序,即堆排序。堆排序利用堆这种数据结构,将选择最小(或最大)元素的时间复杂度从 O(n) 降低到 O(logn)。

插入排序

  • 定义
    插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
  • 要点
    • 逐渐构建有序序列。
    • 将未排序数据插入到已排序序列的合适位置。
  • 时间复杂度
    • 最好情况:O(n)。当数列已经有序时,只需遍历一次,不需要进行插入操作。
    • 最坏情况和平均情况:O(n2)。因为在最坏情况下,每次插入都需要将元素移动到序列的最前面。
  • 空间复杂度:O(1)。只需要常数级的额外空间,用于临时存储待插入的元素。
  • 应用
    可以使用二分查找来优化插入排序中查找插入位置的过程。二分查找可以将查找插入位置的时间复杂度从 O(n) 降低到 O(logn)。以下是使用二分查找优化后的插入排序代码示例:

java

public class BinaryInsertionSort {public static void binaryInsertionSort(int[] arr) {int n = arr.length;for (int i = 1; i < n; i++) {int key = arr[i];int left = 0;int right = i - 1;// 使用二分查找找到插入位置while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] > key) {right = mid - 1;} else {left = mid + 1;}}// 移动元素for (int j = i - 1; j >= left; j--) {arr[j + 1] = arr[j];}// 插入元素arr[left] = key;}}public static void main(String[] args) {int[] arr = {64, 34, 25, 12, 22, 11, 90};binaryInsertionSort(arr);for (int num : arr) {System.out.print(num + " ");}}
}

快速排序

  • 定义
    快速排序是一种分治的排序算法。它选择一个基准值,将数组分为两部分,使得左边部分的所有元素都小于等于基准值,右边部分的所有元素都大于等于基准值,然后分别对左右两部分递归地进行排序。
  • 要点
    • 选择合适的基准值是关键。
    • 分区操作将数组分为两部分。
  • 时间复杂度
    • 最好情况和平均情况:O(nlogn)。每次分区都能将数组大致分成两部分,递归深度为 logn,每层需要 O(n) 的时间进行分区操作。
    • 最坏情况:O(n2)。当基准值选择不当,如数组已经有序时,每次分区只能将数组分成一个元素和其他元素两部分,递归深度为 n。
  • 空间复杂度
    • 平均情况:O(logn)。递归调用栈的深度平均为 logn。
    • 最坏情况:O(n)。当递归深度达到 n 时,栈空间的使用量为 O(n)。
  • 应用
    可以采用随机选择基准值、三数取中等方法来避免最坏情况的发生。随机选择基准值可以使最坏情况发生的概率降低;三数取中是指选择数组的第一个元素、中间元素和最后一个元素中的中位数作为基准值。

归并排序

  • 定义
    归并排序是采用分治法的一个非常典型的应用。它将数组分成两个子数组,分别对两个子数组进行排序,然后将排好序的子数组合并成一个最终的有序数组。
  • 要点
    • 分治思想,将大问题分解为小问题。
    • 合并操作是关键,需要将两个有序子数组合并成一个有序数组。
  • 时间复杂度:最好、最坏和平均情况都是 O(nlogn)。因为每次将数组分成两部分,递归深度为 logn,每层需要 O(n) 的时间进行合并操作。
  • 空间复杂度:O(n)。需要额外的空间来合并子数组,用于临时存储合并后的结果。
  • 应用
    可以采用迭代的方式实现归并排序,避免递归调用栈的开销。迭代实现的归并排序从最小的子数组开始合并,逐步扩大合并的范围。

堆排序

  • 定义
    堆排序利用堆这种数据结构,先将数组构建成一个最大堆(或最小堆),然后依次将堆顶元素与数组末尾元素交换,并调整堆,直到整个数组有序。
  • 要点
    • 堆的构建和调整操作。
    • 最大堆(或最小堆)的性质:每个节点的值都大于(或小于)其子节点的值。
  • 时间复杂度:最好、最坏和平均情况都是 O(nlogn)。构建堆的时间复杂度为 O(n),每次调整堆的时间复杂度为 O(logn),需要进行 n 次调整。
  • 空间复杂度:O(1)。只需要常数级的额外空间,用于交换元素时的临时变量。
  • 应用
    堆排序可以用于解决一些与优先队列相关的问题,如找出数组中的前 k 大(或小)的元素。

2. Dijkstra (求最短路径)

  • 定义

Dijkstra 算法是一种贪心算法,用于求解带权有向图或无向图中单个源点到其他所有顶点的最短路径。它的基本思想是:从源点开始,逐步扩展到距离源点最近的顶点,更新这些顶点到源点的最短距离,直到所有顶点都被访问过。

  • 要点
  1. 使用一个优先队列(最小堆)来存储待处理的顶点,优先处理距离源点最近的顶点。
  2. 维护一个距离数组,记录每个顶点到源点的最短距离。
  3. 标记已访问的顶点,避免重复处理。

代码示例

java

import java.util.*;class Dijkstra {static final int INF = Integer.MAX_VALUE;public static int[] dijkstra(int[][] graph, int src) {int n = graph.length;int[] dist = new int[n];boolean[] visited = new boolean[n];Arrays.fill(dist, INF);dist[src] = 0;PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[1] - b[1]);pq.offer(new int[]{src, 0});while (!pq.isEmpty()) {int[] curr = pq.poll();int u = curr[0];if (visited[u]) continue;visited[u] = true;for (int v = 0; v < n; v++) {if (!visited[v] && graph[u][v] != 0 && dist[u] != INF && dist[u] + graph[u][v] < dist[v]) {dist[v] = dist[u] + graph[u][v];pq.offer(new int[]{v, dist[v]});}}}return dist;}public static void main(String[] args) {int[][] graph = {{0, 4, 0, 0, 0, 0, 0, 8, 0},{4, 0, 8, 0, 0, 0, 0, 11, 0},{0, 8, 0, 7, 0, 4, 0, 0, 2},{0, 0, 7, 0, 9, 14, 0, 0, 0},{0, 0, 0, 9, 0, 10, 0, 0, 0},{0, 0, 4, 14, 10, 0, 2, 0, 0},{0, 0, 0, 0, 0, 2, 0, 1, 6},{8, 11, 0, 0, 0, 0, 1, 0, 7},{0, 0, 2, 0, 0, 0, 6, 7, 0}};int[] dist = dijkstra(graph, 0);for (int i = 0; i < dist.length; i++) {System.out.println("Shortest distance from source to vertex " + i + " is " + dist[i]);}}
}

  • 应用
  1. Dijkstra 算法不能处理负权边,如果图中存在负权边,可以使用 Bellman - Ford 算法。Bellman - Ford 算法通过多次松弛操作来更新顶点的最短距离,可以处理负权边,但时间复杂度较高,为 O(VE),其中 V 是顶点数,E 是边数。
  2. 可以使用邻接表来优化图的存储,减少空间复杂度。邻接表只存储图中的非零边,对于稀疏图可以节省大量的空间。

3. 如何找出旋转数组的某个数

  • 定义

旋转数组是将一个有序数组在某个点进行旋转得到的。可以使用二分查找来找出目标数。通过比较中间元素和数组两端元素的大小关系,判断目标数可能存在的区间。

  • 要点
  1. 确定旋转点的位置,判断数组哪一部分是有序的。
  2. 根据目标数与有序部分的范围关系,缩小查找区间。

代码示例

java

public class SearchInRotatedSortedArray {public static int search(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;}if (nums[left] <= nums[mid]) {if (target >= nums[left] && target < nums[mid]) {right = mid - 1;} else {left = mid + 1;}} else {if (target > nums[mid] && target <= nums[right]) {left = mid + 1;} else {right = mid - 1;}}}return -1;}public static void main(String[] args) {int[] nums = {4, 5, 6, 7, 0, 1, 2};int target = 0;int index = search(nums, target);System.out.println("Index of target: " + index);}
}

  • 应用
  1. 可以处理数组中存在重复元素的情况,此时需要对二分查找的条件进行适当调整。当中间元素与数组两端元素相等时,无法确定哪一部分是有序的,需要将左右指针同时移动一位。
  2. 可以进一步拓展到找出旋转点的位置。通过比较中间元素和其相邻元素的大小关系,判断旋转点在左半部分还是右半部分。

4. 什么是哲学家问题

  • 定义

哲学家问题是一个经典的并发编程问题,描述了多个哲学家围坐在圆桌旁,每个哲学家之间有一根筷子,哲学家交替进行思考和进餐。进餐时需要同时拿起左右两根筷子,否则会挨饿。该问题主要探讨如何避免死锁和资源竞争。

  • 要点
  • 死锁的产生条件
    1. 互斥:资源不能被多个进程同时使用。
    2. 占有并等待:进程已经占有了至少一个资源,又在等待其他资源。
    3. 不可抢占:资源只能由占有它的进程自愿释放,不能被其他进程强行抢占。
    4. 循环等待:多个进程形成一个循环,每个进程都在等待下一个进程所占有的资源。
  • 解决死锁的方法:破坏死锁的产生条件。
  • 解决方法示例
  1. 破坏循环等待:可以给筷子编号,规定哲学家必须先拿起编号较小的筷子,再拿起编号较大的筷子。这样可以避免循环等待的情况发生。
  2. 资源分级:可以引入一个服务员,只有当服务员允许时,哲学家才能拿起筷子。服务员可以控制资源的分配,避免死锁的发生。

  • 应用

哲学家问题可以推广到更一般的资源竞争问题,如多个线程对多个共享资源的竞争。在实际开发中,需要根据具体情况选择合适的解决方法来避免死锁和资源竞争。

5. 如何求最大连续子序列和

  • 定义

可以使用动态规划的思想来解决该问题。定义一个数组 dp,其中 dp[i] 表示以第 i 个元素结尾的最大连续子序列和。状态转移方程为 dp[i] = max(dp[i - 1] + nums[i], nums[i])

  • 要点
  1. 维护一个当前最大连续子序列和和一个全局最大连续子序列和。
  2. 遍历数组,更新当前最大连续子序列和和全局最大连续子序列和。

代码示例

java

public class MaximumSubarray {public static int maxSubArray(int[] nums) {int n = nums.length;int[] dp = new int[n];dp[0] = nums[0];int maxSum = dp[0];for (int i = 1; i < n; i++) {dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);maxSum = Math.max(maxSum, dp[i]);}return maxSum;}public static void main(String[] args) {int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};int maxSum = maxSubArray(nums);System.out.println("Maximum subarray sum: " + maxSum);}
}

  • 应用
  1. 可以优化空间复杂度,只使用常数级的额外空间。因为 dp[i] 只与 dp[i - 1] 有关,可以使用一个变量来代替 dp 数组。以下是优化后的代码示例:

java

public class MaximumSubarrayOptimized {public static int maxSubArray(int[] nums) {int n = nums.length;int currentSum = nums[0];int maxSum = nums[0];for (int i = 1; i < n; i++) {currentSum = Math.max(currentSum + nums[i], nums[i]);maxSum = Math.max(maxSum, currentSum);}return maxSum;}public static void main(String[] args) {int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};int maxSum = maxSubArray(nums);System.out.println("Maximum subarray sum: " + maxSum);}
}

        2. 可以拓展到二维数组,求最大子矩阵和。可以通过枚举矩阵的上下边界,将二维问题转化为一维问题,然后使用一维最大连续子序列和的方法来求解。

6. 如何最左前缀匹配

  • 定义

最左前缀匹配通常用于数据库的索引优化。在数据库中,当查询条件使用了索引的最左前缀时,可以利用索引来加速查询。例如,对于复合索引 (col1, col2, col3),查询条件 WHERE col1 = 'value1' AND col2 = 'value2' 可以使用该索引进行最左前缀匹配。

  • 要点
  1. 索引的顺序很重要,要确保查询条件按照索引的顺序使用。
  2. 当查询条件不满足最左前缀时,可能无法使用索引。

  • 应用
  1. 在实际开发中,要根据业务需求合理设计索引,避免创建过多的索引导致性能下降。过多的索引会增加数据库的维护成本,同时也会影响插入、更新和删除操作的性能。
  2. 可以使用数据库的查询分析工具来分析查询语句是否使用了最左前缀匹配。例如,在 MySQL 中可以使用 EXPLAIN 语句来查看查询的执行计划,判断是否使用了索引。

7. 如何实现单链表反转并输出

  • 定义

可以使用迭代或递归的方法来反转单链表。迭代方法通过遍历链表,依次改变节点的指针方向;递归方法则是先递归地反转后续节点,再调整当前节点的指针方向。

  • 要点
  1. 迭代方法:需要维护三个指针:前一个节点、当前节点和下一个节点。
  2. 递归方法:需要注意递归的终止条件和指针的调整。

代码示例(迭代)

java

class ListNode {int val;ListNode next;ListNode(int x) { val = x; }
}public class ReverseLinkedList {public static ListNode reverseList(ListNode head) {ListNode prev = null;ListNode curr = head;while (curr != null) {ListNode nextTemp = curr.next;curr.next = prev;prev = curr;curr = nextTemp;}return prev;}public static void printList(ListNode head) {ListNode curr = head;while (curr != null) {System.out.print(curr.val + " ");curr = curr.next;}System.out.println();}public static void main(String[] args) {ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(4);head.next.next.next.next = new ListNode(5);System.out.println("Original list:");printList(head);ListNode reversedHead = reverseList(head);System.out.println("Reversed list:");printList(reversedHead);}
}

代码示例(递归)

java

class ListNode {int val;ListNode next;ListNode(int x) { val = x; }
}public class ReverseLinkedListRecursive {public static ListNode reverseList(ListNode head) {if (head == null || head.next == null) {return head;}ListNode newHead = reverseList(head.next);head.next.next = head;head.next = null;return newHead;}public static void printList(ListNode head) {ListNode curr = head;while (curr != null) {System.out.print(curr.val + " ");curr = curr.next;}System.out.println();}public static void main(String[] args) {ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(4);head.next.next.next.next = new ListNode(5);System.out.println("Original list:");printList(head);ListNode reversedHead = reverseList(head);System.out.println("Reversed list:");printList(reversedHead);}
}

  • 应用
  1. 可以考虑反转链表的一部分。可以通过指定反转的起始位置和结束位置,只反转链表的这一部分。
  2. 可以使用递归方法实现链表反转,递归方法的代码更加简洁,但需要注意递归深度可能会导致栈溢出。

8. 如何找到非排序数组中未出现的第一个正整数

  • 定义

可以使用数组本身作为哈希表来解决该问题。首先将数组中所有小于等于 0 或大于数组长度的数置为一个特殊值(如数组长度加 1),然后遍历数组,将出现过的正整数对应的数组位置的元素置为负数,最后再次遍历数组,找到第一个正数所在的位置,该位置加 1 就是未出现的第一个正整数。

  • 要点
  1. 利用数组的索引来标记正整数的出现情况。
  2. 处理数组中小于等于 0 或大于数组长度的数。

代码示例

java

public class FirstMissingPositive {public static int firstMissingPositive(int[] nums) {int n = nums.length;for (int i = 0; i < n; i++) {if (nums[i] <= 0 || nums[i] > n) {nums[i] = n + 1;}}for (int i = 0; i < n; i++) {int num = Math.abs(nums[i]);if (num <= n) {nums[num - 1] = -Math.abs(nums[num - 1]);}}for (int i = 0; i < n; i++) {if (nums[i] > 0) {return i + 1;}}return n + 1;}public static void main(String[] args) {int[] nums = {3, 4, -1, 1};int firstMissing = firstMissingPositive(nums);System.out.println("First missing positive: " + firstMissing);}
}

  • 应用
  1. 可以考虑使用哈希表来解决该问题,但空间复杂度会变为 O(n)。使用哈希表可以更直观地记录正整数的出现情况,但需要额外的空间。
  2. 可以拓展到处理包含负数和 0 的数组。可以先将负数和 0 过滤掉,然后再使用上述方法。

9. 在 0 到 n 这 n + 1 个数中取 n 个数,如何找到缺少的那个

  • 定义

可以使用求和公式或异或运算来解决该问题。求和公式方法是先计算 0 到 n 的和,再减去数组中所有元素的和,得到的差值就是缺少的数;异或运算方法是将 0 到 n 的所有数与数组中的所有数进行异或运算,最终结果就是缺少的数。

  • 要点
  1. 求和公式方法:需要注意可能会出现整数溢出的问题。可以使用长整型来避免溢出。
  2. 异或运算方法:利用了异或的性质:a ^ a = 0a ^ 0 = a

代码示例(异或运算)

java

public class MissingNumber {public static int missingNumber(int[] nums) {int n = nums.length;int xor = 0;for (int i = 0; i < n; i++) {xor ^= nums[i];}for (int i = 0; i <= n; i++) {xor ^= i;}return xor;}public static void main(String[] args) {int[] nums = {3, 0, 1};int missing = missingNumber(nums);System.out.println("Missing number: " + missing);}
}

  • 应用
  1. 可以考虑数组中元素可能重复的情况,此时需要使用其他方法。可以使用哈希表来记录每个元素的出现次数,然后找出出现次数为 0 的元素。
  2. 可以拓展到多维数组或其他数据结构。需要根据具体情况选择合适的方法。

10. 链表中如何判断有环路

  • 定义

可以使用快慢指针的方法来判断链表中是否有环路。快指针每次移动两步,慢指针每次移动一步,如果链表中有环路,快指针最终会追上慢指针。

  • 要点
  1. 初始化快慢指针都指向链表头。
  2. 循环移动快慢指针,直到快指针到达链表末尾或快慢指针相遇。

代码示例

java

class ListNode {int val;ListNode next;ListNode(int x) {val = x;next = null;}
}public class LinkedListCycle {public static boolean hasCycle(ListNode head) {if (head == null || head.next == null) {return false;}ListNode slow = head;ListNode fast = head.next;while (slow != fast) {if (fast == null || fast.next == null) {return false;}slow = slow.next;fast = fast.next.next;}return true;}public static void main(String[] args) {ListNode head = new ListNode(1);ListNode node2 = new ListNode(2);ListNode node3 = new ListNode(3);ListNode node4 = new ListNode(4);head.next = node2;node2.next = node3;node3.next = node4;node4.next = node2;boolean hasCycle = hasCycle(head);System.out.println("Linked list has cycle: " + hasCycle);}
}

  • 应用
  1. 可以进一步找出环路的入口节点。当快慢指针相遇时,将其中一个指针重新指向链表头,然后两个指针都以步长 1 移动,再次相遇的节点就是环路的入口节点。
  2. 可以考虑使用哈希表来判断链表中是否有环路,但空间复杂度会变为 O(n)。使用哈希表可以记录每个节点是否被访问过,如果某个节点被再次访问,则说明链表中有环路。

 友情提示:本文已经整理成文档,可以到如下链接免积分下载阅读

 https://download.csdn.net/download/ylfhpy/90535485

相关文章:

Java面试黄金宝典16

1. 各种排序算法的时间复杂度和空间复杂度 冒泡排序 定义&#xff1a; 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;…...

pytorch中dataloader自定义数据集

前言 在深度学习中我们需要使用自己的数据集做训练&#xff0c;因此需要将自定义的数据和标签加载到pytorch里面的dataloader里&#xff0c;也就是自实现一个dataloader。 数据集处理 以花卉识别项目为例&#xff0c;我们分别做出图片的训练集和测试集&#xff0c;训练集的标…...

LabVIEW 燃气轮机气路故障诊断

在船用燃气轮机气路故障诊断领域&#xff0c;LabVIEW 软件以其独特的功能和优势&#xff0c;成为构建高效、精准诊断系统的关键技术支撑。它全面覆盖硬件在环仿真平台的各个环节&#xff0c;从硬件连接、数据交互到系统功能实现&#xff0c;都发挥着不可替代的作用&#xff0c;…...

[项目]基于FreeRTOS的STM32四轴飞行器: 十六.激光测距定高功能

基于FreeRTOS的STM32四轴飞行器: 十六.激光测距定高功能 一.芯片介绍二.配置CubeMX三.激光测距芯片驱动编写四.定高PID的计算五.定高PID作用到电机上 一.芯片介绍 激光测高芯片在飞控板下侧&#xff1a; 原理图如下&#xff1a; 型号为&#xff1a;VL53LX1&#xff0c;为国产…...

HTML跑酷

先看效果 再上代码 <!DOCTYPE html> <html> <head><title>火柴人跑酷</title><style>body {margin: 0;overflow: hidden;background: #87CEEB;}#gameCanvas {background: linear-gradient(to bottom, #87CEEB 0%, #87CEEB 50%, #228B22 …...

C++Primer学习(14.1 基本概念)

当运算符作用于类类型的运算对象时&#xff0c;可以通过运算符重载重新定义该运算符的含义。明智地使用运算符重载能令我们的程序更易于编写和阅读。举个例子&#xff0c;因为在Sales_item类中定义了输入、输出和加法运算符&#xff0c;所以可以通过下述形式输出两个Sales_item…...

【Goalng】第九弹-----文件操作、JSON处理

&#x1f381;个人主页&#xff1a;星云爱编程 &#x1f50d;所属专栏&#xff1a;【Go】 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 长风破浪会有时&#xff0c;直挂云帆济沧海 目录 1.文件操作 1.1文件介绍 1.2.文件流 1.3.打开和关闭文件 1…...

锐评|希捷NVMe闪存+磁盘混合存储阵列

近日&#xff0c;希捷在英伟达GTC 2025会议上展示了NVMe混合闪存/磁盘阵列技术。这个混合存储阵列确实在当前AI数据存储困境中撕开了一道新口子&#xff0c;但远称不上完美&#xff0c;优缺点都极为鲜明。 从优点来看&#xff0c;希捷切中了大多数企业的痛点。AI领域数据量呈爆…...

如何缩短研发周期,降低研发成本?全星APQP软件为您提供解决方案

如何缩短研发周期&#xff0c;降低研发成本&#xff1f;全星APQP软件为您提供解决方案 一、 系统概述 全星研发管理APQP软件系统是一款专为产品研发和质量管控打造的智能化平台&#xff0c;旨在帮助企业高效推进APQP&#xff08;先期产品质量策划&#xff09;流程&#xff0c…...

Centos7安装cat美化工具lolcat

Centos7安装cat美化工具lolcat Centos7安装lolcat使用ruby安装lolcat配置cat系统别名 结果验证 Centos7安装lolcat lolcat &#xff1a;一个在Linux 终端中输出彩虹特效的命令行工具 使用ruby安装lolcat # 安装ruby和zip yum install -y ruby# 查看ruby版本 ruby --version# …...

bluecode-20240913_1_数据解码

时间限制&#xff1a;C/C 1000MS&#xff0c;其他语言 2000MS 内存限制&#xff1a;C/C 256MB&#xff0c;其他语言 512MB 难度&#xff1a;困难 数据解码 指定有一段经过编码的二进制数据&#xff0c;数据由0个或多个"编码单元"组成。"编码单元"的编码方式…...

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的缓存技术:使用 Redis 提升性能

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…...

典范硬币系统(Canonical Coin System)→ 贪心算法

【典范硬币系统】 ● 典范硬币系统&#xff08;Canonical Coin System&#xff09;是指使用贪心算法总能得到最少硬币数量解‌的货币面值组合‌。 ● 给定一个硬币系统 &#xff0c;若使其为典范硬币系统&#xff0c;则要求其各相邻面值比例 &#xff0c;及各开区间 内各金额…...

hbuilderx打包iOS上传苹果商店的最简流程

无需Mac电脑&#xff0c;无需安装xcode和transporter&#xff0c;其实使用hbuilderx开发的ios软件&#xff0c;也可以上架到苹果的app store商店的。 只需要有苹果开发者中心的苹果开发者账号就行了。 假如你还在了解上架阶段&#xff0c;还没打包&#xff0c;也还没有创建任…...

DeepSeek详解:探索下一代语言模型

文章目录 前言一、什么是DeepSeek二、DeepSeek核心技术2.1 Transformer架构2.1.1 自注意力机制 (Self-Attention Mechanism)(a) 核心思想(b) 计算过程(c) 代码实现 2.1.2 多头注意力 (Multi-Head Attention)(a) 核心思想(b) 工作原理(c) 数学描述(d) 代码实现 2.1.3 位置编码 (…...

python的内存管理

目录 1. 引用计数 2. 垃圾收集&#xff08;GC&#xff09; python的内存管理主要是引用计数和垃圾回收器来进行内存管理 1. 引用计数 每个 Python 对象都有一个引用计数&#xff0c;当引用计数为零时&#xff0c;对象的内存会被释放。 import sysa [] # 创建一个空列表对…...

【STL】list

l i s t list list 是 C C C 标准模板库&#xff08; S T L STL STL&#xff09;中的一个序列容器&#xff08; S e q u e n c e C o n t a i n e r Sequence\ Container Sequence Container&#xff09;&#xff0c;它允许在容器的任意位置快速插入和删除元素&#xff0c;是一…...

证券公司主要业务分析及当前佣金最低免五情况探讨

我是StockMasterX&#xff0c;今日想分析证券公司主要业务&#xff0c;并探讨当前佣金最低且免五的证券公司情况&#xff0c;此议题具有一定研究价值&#xff0c;我从事股票交易多年&#xff0c;与证券公司互动频繁&#xff0c;前日晚间饮茶之际&#xff0c;浏览手机时对此深思…...

C++ 变量的声明与定义分离式编译与静态类型(十六)

1. 声明与定义的区别 声明&#xff08;declaration&#xff09;&#xff1a;向编译器表明某个变量&#xff08;或其他实体&#xff09;的类型与名字&#xff0c;使它在后续的编译过程中可见或可用。定义&#xff08;definition&#xff09;&#xff1a;除了声明变量的名字和类…...

黑盒测试的等价类划分法(输入数据划分为有效的等价类和无效的等价类)

重点: 有效等价和单个无效等价各取1个即可 1、正向用例:一条尽可能覆盖多条2、逆向用例:每一条数据&#xff0c;都是一条单独用例。 步骤: 1、明确需求 2、确定有效和无效等价 3、根据有效和无效造数据编写用例 3、适用场景 针对:需要有大量数据测试输入&#xff0c; …...

通过Appium理解MCP架构

MCP即Model Context Protocol&#xff08;模型上下文协议&#xff09;&#xff0c;是由Anthropic公司于2024年11月26日推出的开放标准框架&#xff0c;旨在为大型语言模型与外部数据源、工具及系统建立标准化交互协议&#xff0c;以打破AI与数据之间的连接壁垒。 MCP架构与Appi…...

uWebSockets开发入门

一、常用C++ WebSocket开源库 一些常用的 C++ WebSocket 开源库,它们支持 WebSocket 协议的实现,适用于客户端或服务器端开发。 1. Boost.Beast (推荐) 特点:基于 Boost.Asio 的高性能库,支持 HTTP/WebSocket,属于 Boost 官方库的一部分,稳定且跨平台。 适用场景:需要高…...

Python自动化模块:开启高效编程新时代

一、写在前面 在数字化时代&#xff0c;自动化技术已成为提高效率、降低成本的关键手段。Python 作为一种简洁、高效且功能强大的编程语言&#xff0c;凭借其丰富的库和框架&#xff0c;在自动化领域占据了举足轻重的地位&#xff0c;成为众多开发者的首选工具之一。从简单的文…...

Android7 Input(二)Linux 驱动层输入事件管理

概述 在Linux系统中&#xff0c;将键盘&#xff0c;鼠标&#xff0c;触摸屏等这类交互设备交由Linux Input子系统进行管理&#xff0c;Linux Input驱动子系统由于具有良好的和用户空间交互的接口。因此Linux Input驱动子系统&#xff0c;不止于只管理输入类型的设备。也可以将其…...

前端给后端发送数据时都需要包含哪些内容?(HTTP请求的基本组成部分)

1 [TOC](1)一、**必须传递的内容**1. **URL&#xff08;请求地址&#xff09;** 二、**可选内容**1. **请求方法&#xff08;HTTP Method&#xff09;**2. **请求头&#xff08;Headers&#xff09;**3. **请求体&#xff08;Body&#xff09;**4. **其他配置** 技术无关 一、必…...

记录vite引入sass预编译报错error during build: [vite:css] [sass] Undefined variable.问题

vite.config.ts resolve: {alias: {: path.resolve(__dirname, src),},},css: {// css预处理器preprocessorOptions: {scss: {additionalData: use "/assets/styles/block.scss" as *;,}}},block.scss $colorGreen: #00ff00;index.vue :v-deep .font-size-14{colo…...

智慧运维平台:赋能未来,开启高效运维新时代

在当今数字化浪潮下&#xff0c;企业IT基础设施、工业设备及智慧城市系统的复杂度与日俱增&#xff0c;传统人工运维方式已难以满足高效、精准、智能的管理需求。停机故障、低效响应、数据孤岛等问题直接影响企业运营效率和成本控制。大型智慧运维平台&#xff08;AIOps, Smart…...

【log4j】配置Slf4j

配置Slf4j 引入lombok包 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.36</version><scope>provided</scope> </dependency>引入log4j相关api <dependency…...

静态网页应用开发环境搭建实战教程

1. 前言 静态网页开发是前端工程师的基础技能之一&#xff0c;无论是个人博客、企业官网还是简单的Web应用&#xff0c;都离不开HTML、CSS和JavaScript。搭建一个高效的开发环境&#xff0c;能够极大提升开发效率&#xff0c;减少重复工作&#xff0c;并优化调试体验。 本教程…...

AP 场景架构设计(一) :OceanBase 读写分离策略解析

说明&#xff1a;本文内容对应的是 OceanBase 社区版&#xff0c;架构部分不涉及企业版的仲裁副本功能。OceanBase社区版和企业版的能力区别详见&#xff1a; 官网链接。 概述​ 当两种类型的业务共同运行在同一个数据库集群上时&#xff0c;这对数据库的配置等条件提出了较高…...

未来村庄智慧灯杆:点亮乡村智慧生活​

在乡村振兴与数字乡村建设的时代进程中&#xff0c;未来村庄智慧灯杆凭借其多功能集成与智能化特性&#xff0c;已成为乡村基础设施建设领域的崭新焦点&#xff0c;为乡村生活带来了前所未有的便利&#xff0c;推动着乡村生活模式的深刻变革。​ 多功能集成&#xff1a;一杆多能…...

MySQL基础语法DDLDML

目录 #1.创建和删除数据库 ​#2.如果有lyt就删除,没有则创建一个新的lyt #3.切换到lyt数据库下 #4.创建数据表并设置列及其属性,name是关键词要用name包围 ​编辑 #5.删除数据表 #5.查看创建的student表 #6.向student表中添加数据,数据要与列名一一对应 #7.查询studen…...

利用 VSCode 配置提升 vibe coding 开发效率

利用 VSCode 配置提升 vibe coding 开发效率 Vibe Coding&#xff08;氛围编程&#xff09;是一种基于AI的编程方法&#xff0c;其核心在于通过自然语言描述软件需求&#xff0c;再由大规模语言模型&#xff08;LLM&#xff09;自动生成代码&#xff0c;从而实现对传统手写编程…...

使用 Chromedp 监听网页请求和响应

使用 Chromedp 监听网页请求和响应 在进行网络爬虫的时候&#xff0c;有很多网站都有反爬机制&#xff0c;比如你想抓点数据&#xff0c;结果发现每次请求都带一堆奇奇怪怪的参数 —— 什么 timestamp 签名、AES 加密的字段&#xff0c;还有各种 Token 令牌&#xff0c;跟密码…...

AB包介绍及导出工具实现+AB包资源简单加载

Resource原理 项目中建立Resources目录&#xff0c;资源导入内部 生成项目包 资源文件存储路径 结论&#xff1a;存储在Resources下的资源&#xff0c;最终会存储在游戏的主体包中&#xff0c;发送给用户&#xff0c;手机系统上&#xff0c;如果需要做资源的更新&#xff0c;是…...

TCP/IP协议簇

文章目录 应用层http/httpsDNS补充 传输层TCP1. 序列号与确认机制2. 超时重传3. 流量控制&#xff08;滑动窗口机制&#xff09;4. 拥塞控制5. 错误检测与校验6. 连接管理总结 网络层ARP**ARP 的核心功能**ARP 的工作流程1. ARP 请求&#xff08;Broadcast&#xff09;2. ARP 缓…...

vector的模拟实现01

文章目录 vector的模拟实现构造函数析构函数迭代器容量sizecapacityreverse 遍历下标[] 修改push_backpop_backinsert 结语 我们大家有又见面了&#xff0c;给生活加点</font color red>impetus&#xff01;&#xff01;开启今天的编程之路 今天我们来学习vector。了解一…...

信息学奥赛一本通 1609:【例 4】Cats Transport | 洛谷 CF311B Cats Transport

【题目链接】 ybt 1609&#xff1a;【例 4】Cats Transport 洛谷 CF311B Cats Transport 【题目考点】 1. 动态规划&#xff1a;斜率优化动规 【解题思路】 解法1&#xff1a;设a点的前缀和 输入的 d d d序列是从 d 2 d_2 d2​到 d n d_n dn​&#xff0c;共n-1个数字。人…...

shared_ptr和 weak_ptr的详细介绍

关于 shared_ptr 和 weak_ptr 的详细介绍及使用示例&#xff1a; 1. shared_ptr&#xff08;共享所有权智能指针&#xff09; 核心特性 引用计数&#xff1a;记录当前有多少个 shared_ptr 共享同一个对象。自动释放&#xff1a;当引用计数归零时&#xff0c;自动释放对象内存…...

electron打包vue2项目流程

1&#xff0c;安装一个node vue2 的项目 2&#xff0c;安装electron&#xff1a; npm install electron -g//如果安装还是 特比慢 或 不想安装cnpn 淘宝镜像查看是否安装成功&#xff1a;electron -v 3&#xff0c;进入到项目目录&#xff1a;cd electron-demo 进入项目目录…...

Baklib驱动企业知识管理数字化转型

Baklib驱动知识资产激活 在信息碎片化与数据爆炸的产业环境下&#xff0c;企业知识中台正成为重构组织智慧的核心枢纽。Baklib通过构建全生命周期知识管理模型&#xff0c;将分散于邮件、文档及协作系统的非结构化数据转化为可检索、可分析的标准化资产。其内置的智能分类引擎…...

Elasticsearch 高级

Elasticsearch 高级 建议阅读顺序&#xff1a; Elasticsearch 入门Elasticsearch 搜索Elasticsearch 搜索高级Elasticsearch高级&#xff08;本文&#xff09; 1. nested 类型 1.1 介绍 Elasticsearch 中的 nested 类型允许你在文档内存储复杂的数据结构&#xff0c;比如一个…...

1--当「穷举」成为艺术:CTF暴力破解漏洞技术从入门到入刑指南(知识点讲解版)

当「穷举」成为艺术&#xff1a;CTF暴力破解漏洞技术从入门到入刑指南 引言&#xff1a;论暴力破解的哲学意义 “世界上本没有漏洞&#xff0c;密码设得简单了&#xff0c;便成了漏洞。” —— 鲁迅&#xff08;并没有说过&#xff09; 想象你是个不会撬锁的小偷&#xff0c;面…...

jdk 支持路线图

https://www.oracle.com/java/technologies/java-se-support-roadmap.html 按照路线图得知&#xff0c;在2025.09 发布openjdk 25&#xff0c;是一个LTS版本。...

VsCode启用右括号自动跳过(自动重写) - 自录制gif演示

VsCode启用右括号自动跳过(自动重写) - 自录制gif演示 前言 不知道大家在编程时候的按键习惯是怎样的。输入完左括号后编辑器一般会自动补全右括号&#xff0c;输入完左括号的内容后&#xff0c;是按→跳过右括号还是按)跳过右括号呢&#xff1f; for (int i 0; i < a.s…...

Android设计模式之模板方法模式

一、定义&#xff1a; 定义一个操作中的算法的框架&#xff0c;而将一些步骤延迟到子类中&#xff0c;使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 二、结构&#xff1a; AbstractClass抽象类&#xff1a;定义算法的骨架&#xff0c;包含模板方法和若干…...

纯个人整理,蓝桥杯使用的算法模板day1(dfs、bfs)

算法索引 dfs&#xff08;深度优先搜索&#xff09;bfs&#xff08;广度优先搜索&#xff09;迷宫树结构 dfs&#xff08;深度优先搜索&#xff09; 功能&#xff1a; 适合搜索所有的解 代码模板&#xff1a; class Solution{public void dfs(int[][] graph, int i, int j){i…...

【第34节】windows原理:PE文件的导出表和导入表

目录 一、导出表 1.1 导出表概述 1.2 说明与使用 二、导入表 2.1 导入表概述 2.2 说明与使用 一、导出表 1.1 导出表概述 &#xff08;1&#xff09;导出行为和导出表用途&#xff1a;PE文件能把自身的函数、变量或者类&#xff0c;提供给其他PE文件使用&#xff0c;这…...

Spring Boot事务管理详解(附银行转账案例)

一、事务基础概念 事务的ACID特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;操作要么全部成功&#xff0c;要么全部失败一致性&#xff08;Consistency&#xff09;&#xff1a;数据在事务前后保持合法状态隔离性&#xff08;Isolation&#xff09;&…...

(头歌作业—python)3.2 个人所得税计算器(project)

第1关&#xff1a;个人所得税计算器 任务描述 本关任务&#xff1a;编写一个个人所得税计算器的小程序。 相关知识 个人所得税缴纳标准 2018 年 10 月 1 日以前&#xff0c;个税免征额为 3500 元/月&#xff0c;调整后&#xff0c;个税免征额为 5000 元/月&#xff0c; 7 级超…...