面试题答案
一键面试#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
std::string processVector(const std::vector<std::pair<int, std::string>>& vec) {
// 排序
std::vector<std::pair<int, std::string>> sortedVec = vec;
std::sort(sortedVec.begin(), sortedVec.end(), [](const auto& a, const auto& b) {
if (a.first != b.first) {
return a.first > b.first;
}
return a.second < b.second;
});
// 找到优先级最高的所有字符串并拼接
std::string result;
if (!sortedVec.empty()) {
int highestPriority = sortedVec[0].first;
for (const auto& pair : sortedVec) {
if (pair.first == highestPriority) {
result += pair.second;
}
}
}
return result;
}
时间复杂度优化
- 排序部分:
std::sort
通常使用快速排序、归并排序或堆排序等高效排序算法,平均时间复杂度为 $O(n log n)$,这里n
是向量的大小。在本代码中,使用了std::sort
对向量进行排序,这已经是一个较为高效的做法。 - 拼接部分:找到优先级最高的所有字符串并拼接的过程,遍历了一次排序后的向量,时间复杂度为 $O(n)$。整体算法的时间复杂度主要由排序部分决定,为 $O(n log n)$。
空间复杂度优化
- 额外空间:代码中使用了一个
sortedVec
来存储排序后的结果,空间复杂度为 $O(n)$。如果希望进一步优化空间复杂度,可以选择对原向量vec
进行就地排序(std::sort
可以做到),这样可以将空间复杂度降低到 $O(1)$(忽略递归调用栈等额外空间)。 - 字符串拼接:在拼接字符串时,
result
存储最终结果,空间复杂度为 $O(k)$,其中k
是所有优先级最高的字符串长度之和。在最坏情况下,k
可能与n
成正比,即所有字符串优先级都相同且都需要拼接,此时空间复杂度为 $O(n)$。
总体而言,通过就地排序可以将空间复杂度优化到 $O(1)$,而时间复杂度在当前实现下已经是较为高效的 $O(n log n)$。