leocde242
class Solution {
public:
bool isAnagram(string s, string t) {
int arr[26]={0};
for(int i=0;i<s.length();i++){ //字符串是length
arr[s[i]-'a']+=1; //減去小a,剛好符合ASCII碼位置
}
for(int i=0;i<t.length();i++){
arr[t[i]-'a']-=1;
}
for(int i=0;i<26;i++){
if(arr[i]!=0){
return false;
}
}
return true;
}
};lecode 349
class Solution {
public:
vector& nums1, vector& nums2) {
std::unordered_set mp;
for(int i=0;i<nums1.size();i++){
mp.insert(nums1[i]);
}
std::unordered_set res;
for(int i=0;i<nums2.size();i++){
if(mp.find(nums2[i])!=mp.end()){
res.insert(nums2[i]);
}
}
std::vector result;
std::unordered_set::iterator i=res.begin();
while(i!=res.end()){
result.push_back(*i);
i++;
}
return result;
}
};gemini版本
class Solution {
public:
vector& nums1, vector& nums2) {
// 1. 直接利用構造函數將 nums1 放入集合,自動去重
std::unordered_set set1(nums1.begin(), nums1.end());
std::unordered_set<int> intersection_set;
// 2. 使用範圍 for 循環遍歷 nums2,代碼更清爽
for (int num : nums2) {
// 3. 判斷 num 是否存在於 set1 中
// .count() 返回 1 表示存在,0 表示不存在 (比 find 寫法更簡潔)
if (set1.count(num)) {
intersection_set.insert(num);
}
}
// 4. 直接利用構造函數將 set 轉回 vector
return vector<int>(intersection_set.begin(), intersection_set.end());
}
};
知道 vector 和 set 可以通過迭代器互相轉換,不需要手動搬運數據。
for(int num : nums2) C++11 的範圍循環,語義更清晰,防止越界。
Vector 的秘密
std::vector 看起來像個可以自動變長的數組,但你需要知道它為了“自動變長”付出了什麼代價。這是面試官判斷你是否懂底層的金標準。
- 底層實現原理
本質:它是一段連續的內存空間(和數組一樣)。
三個指針:雖然標準沒規定,但通常實現包含三個指針:
_Myfirst:指向數組頭。
_Mylast:指向當前已存數據的尾部(對應 size())。
_Myend:指向這段內存的盡頭(對應 capacity())。
- 核心考點:擴容機制 (Reallocation)
問題:當 push_back 且內存已滿(size == capacity)時,發生什麼?
過程(必須背誦):
開闢新空間:找一塊更大的內存(通常是原來的 1.5 倍或 2 倍)。
搬家:把舊數據拷貝(或移動)到新內存。
拆遷:釋放舊內存空間。
更新指針:指向新家。
代價:非常昂貴!所以要儘量避免擴容。
- 關鍵優化:reserve() vs resize()
reserve(n):只修改 capacity,不創建對象。如果你知道大概要存 1000 個數,直接 v.reserve(1000),這樣 push_back 過程中就不會發生擴容搬家,性能極大提升。
resize(n):修改 size,會創建默認對象填充。
- 迭代器失效 (Iterator Invalidation)
如果在 vector 擴容後,你手裏還握着指向“舊房子”的迭代器或指針,再去訪問就會崩潰(Segmentation Fault)。因為舊房子已經被拆了(釋放了)。
面試官問:vector 的 push_back 和 emplace_back 有什麼區別?
答案:push_back 可能會先創建一個臨時對象,再拷貝/移動進去;emplace_back 是直接在 vector 尾部內存上原地構造對象,省了一次拷貝/移動,效率更高。