本文源自于个人github仓库:https://github.com/forthespada/InterviewGuide
github仓库内有PDF版本笔记下载方式,欢迎各位star、fork~
立志收录计算机校招、社招面试最全面试,无内鬼来点八股文~
八股文:一般指的就是面试中常问问题,固定回答的问题,比如常见的进程线程区别、TCP三次握手四次挥手等

5、快排排序

void quickSort(vector<int>& data, int low, int high) {
    //for_each(data.begin(), data.end(), [](const auto a) {cout << a << " "; });
    //cout << endl;
    if (low >= high) return;
    int key = data[low], begin = low, end = high;
    while (begin < end) {
        while (begin<end && data[end]>key) {
            end--;
        }
        if (begin < end) data[begin++] = data[end];

        while (begin<end && data[begin]<= key) {
            begin++;
        }
        if (begin < end) data[end--] = data[begin];


    }

    data[begin] = key;
    quickSort(data, low, begin - 1);
    quickSort(data, begin + 1,high);
}

6、归并排序

void mergeSort(vector<int>& data, vector<int>& copy, int begin, int end) {
    if (begin >= end) return;
    int mid = begin + (end - begin) / 2;
    int low1 = begin, high1 = mid, low2 = mid + 1, high2 = end, index = begin;
    mergeSort(copy, data, low1, high1);
    mergeSort(copy, data, low2, high2);
    while (low1 <= high1 && low2 <= high2) {

        copy[index++] = data[low1] < data[low2] ? data[low1++] : data[low2++];
    }
    while (low1 <= high1) {
        copy[index++] = data[low1++];
    }

    while (low2 <= high2) {
        copy[index++] = data[low2++];
    }
}

void mergeTest() {
    vector<int> nums = { -5,-10,6,5,12,96,1,2,3 };
    vector<int> copy(nums);
    mergeSort(nums, copy, 0, nums.size() - 1);
    nums.assign(copy.begin(), copy.end());
    for_each(nums.begin(), nums.end(), [](const auto& a) {cout << a << " "; });
}

7、设计LRU缓存

设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的项目。

它应该支持以下操作: 获取数据 get 和 写入数据 put 。

获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。

LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );

cache.put(1, 1);
cache.put(2, 2);
cache.get(1);       // 返回  1
cache.put(3, 3);    // 该操作会使得密钥 2 作废
cache.get(2);       // 返回 -1 (未找到)
cache.put(4, 4);    // 该操作会使得密钥 1 作废
cache.get(1);       // 返回 -1 (未找到)
cache.get(3);       // 返回  3
cache.get(4);       // 返回  4

链接:https://leetcode-cn.com/problems/lru-cache-lcci

struct DoubleList {
    int key, val;
    DoubleList* pre, * next;
    DoubleList(int _key,int _val):key(_key),val(_val),pre(nullptr),next(nullptr){ }
};

class LRU {
private:
    int capacity;
    DoubleList* head, * tail;
    unordered_map<int, DoubleList*> memory;
public:
    LRU(int _capacity) {
        this->capacity = _capacity;
        head = new DoubleList(-1, -1);
        tail = new DoubleList(-1, -1);
        head->next = tail;
        tail->pre = head;
    }
    ~LRU(){
        if (head != nullptr) {
            delete head;
            head = nullptr;
        }
        if (tail != nullptr) {
            delete tail;
            tail = nullptr;
        }
        for (auto& a : memory) {
            if (a.second != nullptr) {
                delete a.second;
                a.second = nullptr;
            }
        }
    }
    void set(int _key, int _val) {
        if (memory.find(_key) != memory.end()) {
            DoubleList* node = memory[_key];
            removeNode(node);
            node->val = _val;
            pushNode(node);
            return ;
        }
        if (memory.size() == this->capacity) {// 这里很重要,也很爱错,千万记得更新memory
            int topKey = head->next->key;//取得key值,方便在后面删除