面试题答案
一键面试设计思路
- 结构体定义:首先定义包含不同类型成员变量的结构体。
- 动态数组:使用
std::vector
来存储结构体对象,std::vector
在内存管理上较为方便,能自动扩展和收缩,相比普通数组更适合动态数据。 - 插入操作:在
std::vector
末尾直接添加元素,时间复杂度为$O(1)$均摊。如果需要保持某种顺序,插入后可能需要调整顺序,时间复杂度会增加。 - 删除操作:通过找到要删除元素的位置,使用
erase
方法删除,时间复杂度为$O(n)$,因为删除元素后需要移动后续元素。 - 查找操作:可以使用线性查找,时间复杂度为$O(n)$。如果数据有序,可以使用二分查找,时间复杂度为$O(\log n)$。
- 内存管理:
std::vector
负责自动管理内存,在对象析构时会自动释放内存,无需手动管理。
关键代码实现
#include <iostream>
#include <vector>
#include <algorithm>
// 自定义结构体
struct CustomStruct {
int id;
std::string name;
double value;
CustomStruct(int i, const std::string& n, double v) : id(i), name(n), value(v) {}
};
class CustomArray {
private:
std::vector<CustomStruct> data;
public:
// 插入操作
void insert(const CustomStruct& obj) {
data.push_back(obj);
}
// 删除操作
void remove(int id) {
auto it = std::find_if(data.begin(), data.end(), [id](const CustomStruct& s) {
return s.id == id;
});
if (it != data.end()) {
data.erase(it);
}
}
// 查找操作
CustomStruct* find(int id) {
for (auto& obj : data) {
if (obj.id == id) {
return &obj;
}
}
return nullptr;
}
};
时间复杂度分析
- 插入操作:均摊时间复杂度为$O(1)$,因为
std::vector
在一般情况下在末尾添加元素是常数时间操作。但当std::vector
需要重新分配内存时,时间复杂度为$O(n)$,不过这种情况很少发生,因此均摊为$O(1)$。 - 删除操作:时间复杂度为$O(n)$,因为需要线性查找要删除的元素,然后移动后续元素。
- 查找操作:线性查找时间复杂度为$O(n)$;如果数据有序并使用二分查找,时间复杂度为$O(\log n)$。
空间复杂度分析
空间复杂度为$O(n)$,其中$n$是存储的结构体对象的数量。std::vector
会分配足够的内存来存储所有元素,并且可能会有一些额外的空间用于扩展,但总体空间与元素数量成正比。