数据结构设计高频题目

题目1 : setAll功能的哈希表

cpp 复制代码
#include <iostream>
#include <unordered_map>
#include <vector>

using namespace std;

int cnt = 0;
int setAllValue = 0;
int setAllTimes = -1;

unordered_map<int, pair<int, int>> map;

void put(int key, int val) {
    if (map.find(key) != map.end()) {
        // 如果已经存在,则更新值和次数
        map[key].first = val;
        map[key].second = cnt++;
    } else {
        // 如果不存在,则插入新键值对
        map[key] = {val, cnt++};
    }
}

int get(int key) {
    if (map.find(key) == map.end()) {
        return -1;
    }
    auto& value = map[key];
    if (value.second > setAllTimes) {
        return value.first;
    } else {
        return setAllValue;
    }
}

void setAll(int val) {
    setAllValue = val;
    setAllTimes = cnt++;
}

int main() {
    put(1, 1);
    cout << get(1) << endl; // 输出: 1
    setAll(2);
    cout << get(1) << endl; // 输出: 2
    return 0;
}

题目2 : 实现LRU结构

LRU结构就是,

可以使用HashMap和双向链表来实现,

题目3 : 插入、删除和获取随机元素O(1)时间的结构

题目4 : 插入、删除和获取随机元素O(1)时间且允许有重复数字的结构

cpp 复制代码
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <cstdlib>
#include <ctime>

using namespace std;

class InsertDeleteRandom {
public:
    bool insert(int val) {
        // 数组中插入元素
        vec.push_back(val);
        // 记录下标
        int idx = vec.size() - 1;
        unordered_set<int>& set = map[val];
        set.insert(idx);

        return set.size() == 1;
    }

    bool remove(int val) {
        if (map.find(val) == map.end()) {
            return false;
        }
        unordered_set<int>& valSet = map[val];
        int valueIdx = *valSet.begin();
        int endValue = vec.back();
        if (val == endValue) {
            // 如果要删除的值刚好在数组末尾
            valSet.erase(vec.size() - 1);
        } else {
            unordered_set<int>& endValueSet = map[endValue];
            vec[valueIdx] = endValue;  // 将数组末尾的值移动到要删除的位置
            endValueSet.insert(valueIdx);  // 更新数组末尾值的下标
            endValueSet.erase(vec.size() - 1);  // 删除数组末尾值的下标
            valSet.erase(valueIdx);  // 删除要删除的值在数组中的下标
        }
        vec.pop_back();  // 删除数组末尾的值
        if (valSet.empty()) {
            map.erase(val);  // 如果要删除的值在数组中不存在,则从哈希表中移除
        }
        return true;
    }

    int getRandom() {
        int randomIdx = rand() % vec.size();
        return vec[randomIdx];
    }

    // 打印数组
    void print() const {
        cout << "print vec: ";
        for (int num : vec) {
            cout << num << " ";
        }
        cout << endl;
    }
private:
    unordered_map<int, unordered_set<int>> map;
    vector<int> vec;
};

int main() {
    srand((unsigned int)time(nullptr));
    InsertDeleteRandom idr;
    cout << boolalpha;
    cout << idr.insert(1) << endl;
    cout << idr.insert(1) << endl;
    cout << idr.insert(2) << endl;
    cout << idr.remove(3) << endl;
    idr.print();
    cout << idr.insert(4) << endl;
    cout << idr.remove(1) << endl;
    idr.print();
    cout << idr.getRandom() << endl;    
    cout << idr.getRandom() << endl;

    return 0;
}

题目5 : 快速获得数据流的中位数的结构

当大根堆为空或者数据小于等于大根堆的堆顶的值时,加入大根堆,其余数据加入小根堆,当大小根堆的元素数量差大于1时,就需要调整,始终保持大小根堆的元素差值小于等于1。

cpp 复制代码
#include <iostream>
#include <queue>
#include <vector>

using namespace std;

class FindMedian {
public:
    void addNum(int num) {
        if (maxHeap.empty() || num <= maxHeap.top()) {
            maxHeap.push(num);
        } else {
            minHeap.push(num);
        }
        balance();
    }

    double findMedian() {
        if (maxHeap.size() == minHeap.size()) {
            return (maxHeap.top() + minHeap.top()) / 2.0;
        } else {
            return maxHeap.size() > minHeap.size() ? maxHeap.top() : minHeap.top();
        }
    }

private:
    priority_queue<int, vector<int>, less<int>> maxHeap;
    priority_queue<int, vector<int>, greater<int>> minHeap;

    void balance() {
        if (maxHeap.size() >= minHeap.size() + 2) {
            minHeap.push(maxHeap.top());
            maxHeap.pop();
        } else if (minHeap.size() >= maxHeap.size() + 2) {
            maxHeap.push(minHeap.top());
            minHeap.pop();
        }
    }
};

题目6 : 最大频率栈

题目7 : 全O(1)的数据结构

相关推荐
海奥华218 分钟前
Golang Channel 原理深度解析
服务器·开发语言·网络·数据结构·算法·golang
星火开发设计29 分钟前
链表详解及C++实现
数据结构·c++·学习·链表·指针·知识
CCPC不拿奖不改名35 分钟前
python基础:python语言的数据结构+面试习题
开发语言·数据结构·python·面试
CCPC不拿奖不改名1 小时前
Python基础:python语言中的文件操作+面试题目
开发语言·数据结构·人工智能·python·学习·面试·职场和发展
橘颂TA1 小时前
【剑斩OFFER】算法的暴力美学——力扣 43 题:字符串相乘
数据结构·算法·leetcode·职场和发展·哈希算法·结构与算法
lalala_lulu1 小时前
MySQL数据库存储引擎的数据结构(超详细版)
数据结构·数据库·mysql
漫随流水1 小时前
leetcode算法(199.二叉树的右视图)
数据结构·算法·leetcode·二叉树
黎雁·泠崖1 小时前
二叉树入门全攻略:从树的概念到遍历实现
c语言·数据结构
海奥华21 小时前
Golang Slice深度解析
开发语言·数据结构·后端·链表·golang
多米Domi0112 小时前
0x3f 第24天 黑马web (安了半天程序 )hot100普通数组
数据结构·python·算法·leetcode