返回

面试问我TopK问题,我只用一招轻松回击!

见解分享

前言
大家好,我是老王,一名资深的编程面试官。今天,我想和大家分享一个面试中经常被问到的问题——TopK问题。

什么是TopK问题?

TopK问题是指在给定一个数组和一个整数K时,找出数组中最大的K个元素。例如,给定数组[1, 2, 3, 4, 5]和K=3,TopK问题就是要找出数组中最大的3个元素,即[5, 4, 3]。

解决方案

解决TopK问题的方法有很多,这里介绍一种简单有效的解决方案——堆排序。堆排序是一种基于堆数据结构的排序算法,它可以高效地找到数组中的最大或最小子集。

堆排序的算法流程如下:

  1. 将给定数组构建成一个最大堆。
  2. 重复以下步骤,直到堆中只剩下K个元素:
    • 从堆中弹出堆顶元素,即最大的元素。
    • 将剩余元素重新构建成一个最大堆。

最终,堆中剩下的K个元素就是数组中最大的K个元素。

代码示例

import java.util.Arrays;

public class TopK {

    public static int[] topK(int[] nums, int k) {
        // 构建最大堆
        buildMaxHeap(nums);

        // 重复弹出堆顶元素,直到堆中只剩下K个元素
        int[] result = new int[k];
        for (int i = 0; i < k; i++) {
            result[i] = popMax(nums);
        }

        return result;
    }

    private static void buildMaxHeap(int[] nums) {
        for (int i = nums.length / 2 - 1; i >= 0; i--) {
            maxHeapify(nums, i);
        }
    }

    private static int popMax(int[] nums) {
        int max = nums[0];
        nums[0] = nums[nums.length - 1];
        maxHeapify(nums, 0);
        return max;
    }

    private static void maxHeapify(int[] nums, int i) {
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        int largest = i;

        if (left < nums.length && nums[left] > nums[i]) {
            largest = left;
        }

        if (right < nums.length && nums[right] > nums[largest]) {
            largest = right;
        }

        if (largest != i) {
            int temp = nums[i];
            nums[i] = nums[largest];
            nums[largest] = temp;
            maxHeapify(nums, largest);
        }
    }

    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int k = 3;
        int[] result = topK(nums, k);
        System.out.println(Arrays.toString(result));
    }
}

技巧和建议

在面试中,除了掌握算法知识外,还有一些技巧和建议可以帮助您取得优异成绩。

  • 仔细阅读题目。 在回答问题之前,一定要仔细阅读题目,确保您理解了题目中的要求。
  • 组织好思路。 在回答问题之前,先在脑海中组织好思路,然后用清晰的语言表达出来。
  • 使用正确的术语。 在回答问题时,尽量使用正确的术语,这样可以使您的回答更专业。
  • 注意时间。 面试时间有限,因此您需要在有限的时间内完成问题。
  • 保持冷静。 面试时难免会紧张,但您需要保持冷静,以便更好地发挥您的实力。

总结

TopK问题是编程面试中常见的算法问题。通过学习堆排序算法,您可以轻松解决TopK问题。此外,掌握一些技巧和建议,也可以帮助您在面试中取得优异成绩。