Java快速排序(含面试大厂题和源码)

本文介绍了三个与快速排序相关的编程题目,包括寻找数组中第K个最大元素、验证有效数独和合并两个有序数组,旨在帮助面试者提升算法理解和实战能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序是一种广泛使用的排序算法,因其高效性在面试中经常被提及。以下是三道可能出现在大厂面试中的与快速排序相关的编程题目,以及相应的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));
    }
}

这些题目和源码展示了快速排序在解决实际问题中的应用。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值