161. 说说哈希表的实现原理。你会如何设计一个哈希函数?

哈希表(Hash Table)是个高效的键值存储结构,核心想法是把键(key)通过一个哈希函数映射到一个数组的下标,然后把对应的值(value)存到那儿。查找时再用同样的哈希函数算一遍下标,直接去数组里取值。简单说,它把“查字典”变成了“查数组”。

在这里插入图片描述

怎么设计一个哈希函数?

在这里插入图片描述
在这里插入图片描述

162. 给定两个大文件,存储URL,如何找到相同的URL?

问题分析

在这里插入图片描述

解题思路

在这里插入图片描述
在这里插入图片描述

163. 解释vector中resize和reserve的作用,它们如何影响capacity和size?

size 和 capacity

在这里插入图片描述

resize的作用

在这里插入图片描述

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3};
    std::cout << "初始 size: " << v.size() << ", capacity: " << v.capacity() << "\n";
    // 输出: size: 3, capacity: 3 (或更大,视实现)

    v.resize(5); // 变大,默认填充 0
    std::cout << "resize(5) 后 size: " << v.size() << ", capacity: " << v.capacity() << "\n";
    // 输出: size: 5, capacity: >=5 (可能 6、8)
    for (int x : v) std::cout << x << " "; // 1 2 3 0 0
    std::cout << "\n";

    v.resize(2); // 变小,砍掉后面
    std::cout << "resize(2) 后 size: " << v.size() << ", capacity: " << v.capacity() << "\n";
    // 输出: size: 2, capacity: 未变 (还是 >=5)
    for (int x : v) std::cout << x << " "; // 1 2
    std::cout << "\n";

    return 0;
}

在这里插入图片描述

reserve 的作用

在这里插入图片描述

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3};
    std::cout << "初始 size: " << v.size() << ", capacity: " << v.capacity() << "\n";
    // 输出: size: 3, capacity: 3 (或更大)

    v.reserve(10); // 预留空间
    std::cout << "reserve(10) 后 size: " << v.size() << ", capacity: " << v.capacity() << "\n";
    // 输出: size: 3, capacity: >=10 (可能 10、16)
    for (int x : v) std::cout << x << " "; // 1 2 3
    std::cout << "\n";

    v.push_back(4); // 不重新分配
    std::cout << "push_back 后 size: " << v.size() << ", capacity: " << v.capacity() << "\n";
    // 输出: size: 4, capacity: 未变
    for (int x : v) std::cout << x << " "; // 1 2 3 4
    std::cout << "\n";

    v.reserve(6);
    std::cout << "reserve(6) 后 size: " << v.size() << ", capacity: " << v.capacity() << "\n";
    // 输出: size: 4, capacity: 未变
    for (int x : v) std::cout << x << " "; // 1 2 3 4
    std::cout << "\n";
    return 0;
}

在这里插入图片描述

164. 算法题:判断一个完全二叉树是不是满二叉树

#include <iostream>
#include <queue>

// 二叉树节点定义
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

// 判断是否满二叉树
class Solution {
private:
    // 判断是否为满二叉树
    bool isFullBinaryTree(TreeNode* root) {
        if (!root) return true; // 空树认为是满的
        // 检查每个非叶子节点是否都有两个子节点
        if ((root->left && !root->right) || (!root->left && root->right)) {
            return false;
        }
        return isFullBinaryTree(root->left) && isFullBinaryTree(root->right);
    }

    // 判断是否为完全二叉树
    bool isCompleteBinaryTree(TreeNode* root) {
        if (!root) return true;  // 空树认为是完全二叉树
        std::queue<TreeNode*> q;
        q.push(root);
        bool isNullChild = false;  // 标记是否遇到过缺少子节点的情况
        
        // 1 2 3 4 nullptr nullptr nullptr nullptr nullptr

        // 1 2 3 nullptr nullptr 4 nullptr
        while (!q.empty()) {
            TreeNode* node = q.front();
            q.pop();

            if (!node) {
                isNullChild = true;  // 遇到空节点
            } else {
                // 如果已经遇到空节点,再出现非空节点,说明不是完全二叉树
                if (isNullChild) {
                    return false;
                }
                // 把左右子节点加入队列
                q.push(node->left);
                q.push(node->right);
            }
        }
        return true;
    }

public:
    void checkBinaryTreeType(TreeNode* root) {
        if (isFullBinaryTree(root)) {
            std::cout << "This is a Full Binary Tree.\n";
        } else if (isCompleteBinaryTree(root)) {
            std::cout << "This is a Complete Binary Tree.\n";
        } else {
            std::cout << "This is neither a Full nor a Complete Binary Tree.\n";
        }
    }
};

// 构造树并测试
TreeNode* buildFullTree() {
    // 树:  1
    //      / \
    //     2   3
    //    / \  /\
    //   4   5 6 7
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->left = new TreeNode(4);
    root->left->right = new TreeNode(5);
    root->right->left = new TreeNode(6);
    root->right->right = new TreeNode(7);
    return root;
}

TreeNode* buildCompleteTree() {
    // 树:  1
    //      / \
    //     2   3
    //    /
    //   4
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->left = new TreeNode(4);
    return root;
}

TreeNode* buildNeitherTree() {
    // 树:  1
    //      / \
    //     2   3
    //        / 
    //       4
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->right->left = new TreeNode(4);
    return root;
}

void deleteTree(TreeNode* root) {
    if (!root) return;
    deleteTree(root->left);
    deleteTree(root->right);
    delete root;
}

int main() {
    Solution solution;

    // 测试用例 1:满二叉树
    TreeNode* fullTree = buildFullTree();
    solution.checkBinaryTreeType(fullTree);  // 预期:满二叉树
    deleteTree(fullTree);

    // 测试用例 2:完全二叉树
    TreeNode* completeTree = buildCompleteTree();
    solution.checkBinaryTreeType(completeTree);  // 预期:完全二叉树
    deleteTree(completeTree);

    // 测试用例 3:既不是满二叉树也不是完全二叉树
    TreeNode* neitherTree = buildNeitherTree();
    solution.checkBinaryTreeType(neitherTree);  // 预期:既不是满二叉树也不是完全二叉树
    deleteTree(neitherTree);

    return 0;
}

在这里插入图片描述

165. 如何理解C++线程中的sleep和wait ?

sleep(线程休眠)

在这里插入图片描述
在这里插入图片描述

wait(线程等待)

在这里插入图片描述
在这里插入图片描述
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐