快速排序是一种广泛使用的排序算法,因其高效性在面试中经常被提及。以下是三道可能出现在大厂面试中的与快速排序相关的编程题目,以及相应的Java源码实现。
题目 1:数组中的第K个最大元素
描述:
给定一个未排序的整数数组和一个整数 k,找出数组中第 k 个最大的元素。
示例:
输入: [3, 2, 1, 5, 6, 4], k = 2
输出: 5
Java 源码:
public class KthLargest {
public int findKthLargest(int[] nums, int k) {
int n = nums.length;
for (int i = 0; i < k; i++) {
int maxIndex = partition(nums, 0, n - 1);
// 如果最大元素的索引小于n-k,则移动左边界
if (maxIndex < n - k) {
nums = Arrays.copyOfRange(nums, maxIndex + 1, n);
n = nums.length;
} else if (maxIndex > n - k) {
nums = Arrays.copyOfRange(nums, 0, maxIndex);
n = nums.length;
}
}
return nums[0];
}
private int partition(int[] nums, int low, int high) {
int pivot = nums[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (nums[j] > pivot) {
i++;
swap(nums, i, j);
}
}
swap(nums, i + 1, high);
return i + 1;
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
public static void main(String[] args) {
KthLargest solution = new KthLargest();
int[] nums = {3, 2, 1, 5, 6, 4};
int k = 2;
int result = solution.findKthLargest(nums, k);
System.out.println("The " + k + "th largest element is: " + result);
}
}
题目 2:有效的数独
描述:
判断一个 9x9 的数独是否有效。只需要根据数独行、列和 3x3 宫格内数字的分布判断。
示例:
输入:
[
["5","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]
]
输出: true
Java 源码:
public class ValidSudoku {
public boolean isValidSudoku(char[][] board) {
int[] rows = new int[9], cols = new int[9], boxes = new int[9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
char num = board[i][j];
if (num != '.') {
int boxIndex = (i / 3) * 3 + j / 3;
if (rows[i] == cols[j] && boxes[boxIndex] == num) {
return false;
}
rows[i]++;
cols[j]++;
boxes[boxIndex]++;
}
}
}
return true;
}
public static void main(String[] args) {
ValidSudoku solution = new ValidSudoku();
char[][] board = {
{'5', '3', '.', '.', '7', '.', '.', '.', '.'},
{'6', '.', '.', '1', '9', '5', '.', '.', '.'},
{'.', '9', '8', '.', '.', '.', '.', '6', '.'},
{'8', '.', '.', '.', '6', '.', '.', '.', '3'},
{'4', '.', '.', '8', '.', '3', '.', '.', '1'},
{'7', '.', '.', '.', '2', '.', '.', '.', '6'},
{'.', '6', '.', '.', '.', '.', '2', '8', '.'},
{'.', '.', '.', '4', '1', '9', '.', '.', '5'},
{'.', '.', '.', '.', '8', '.', '.', '7', '9'}
};
boolean result = solution.isValidSudoku(board);
System.out.println("Is the sudoku valid? " + result);
}
}
题目 3:合并有序数组
描述:
给定两个有序整数数组,将它们合并为一个新的有序数组,你可以假设它们有足够的空间来保存合并后的数组。
示例:
输入:
nums1 = [1, 2, 3, 0, 0, 0], m = 3
nums2 = [2, 5, 3], n = 3
输出: [1, 2, 2, 3, 3, 5]
Java 源码:
public class MergeSortedArrays {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = 0, j = 0, k = 0;
while (i < m && j < n) {
if (nums1[i] < nums2[j]) {
nums1[k++] = nums1[i++];
} else {
nums1[k++] = nums2[j++];
}
}
while (j < n) {
nums1[k++] = nums2[j++];
}
}
public static void main(String[] args) {
MergeSortedArrays solution = new MergeSortedArrays();
int[] nums1 = {1, 2, 3, 0, 0, 0};
int m = 3;
int[] nums2 = {2, 5, 3};
int n = 3;
solution.merge(nums1, m, nums2, n);
System.out.println("The merged array is: " + Arrays.toString(nums1));
}
}
这些题目和源码展示了快速排序在解决实际问题中的应用。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试!