242題思路就是分別遍歷兩個單詞,統計字母數量看看是否一致。
1 class Solution { 2 public: 3 bool isAnagram(string s, string t) { 4 vector<int>tmp1(26); 5 int len1 = s.size(); 6 int len2 = t.size(); 7 if(len1!=len2){ 8 return false; 9 } 10 for(int i=0;i<len1;i++){ 11 tmp1[s[i]-'a']++; 12 tmp1[t[i]-'a']--; 13 } 14 for(int k=0;k<26;k++){ 15 if(tmp1[k]!=0){ 16 return false; 17 } 18 } 19 return true; 20 } 21 };
349題的程式碼基本全部看不懂,貼一下原文程式碼吧
1 class Solution { 2 public: 3 vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { 4 unordered_set<int> result_set; // 存放結果,之所以用set是為了給結果集去重 5 unordered_set<int> nums_set(nums1.begin(), nums1.end()); 6 for (int num : nums2) { 7 // 發現nums2的元素 在nums_set裡又出現過 8 if (nums_set.find(num) != nums_set.end()) { 9 result_set.insert(num); 10 } 11 } 12 return vector<int>(result_set.begin(), result_set.end()); 13 } 14 }; 15 //這段程式碼是一個C++函式,屬於一個名為 Solution 的類,其目的是找出兩個整數陣列 nums1 和 nums2 的交集。下面我將逐行解釋這段程式碼: 16 17 //unordered_set<int> nums_set(nums1.begin(), nums1.end()); 18 //這行程式碼建立了一個名為 nums_set 的 unordered_set(無序集合)物件,它包含 nums1 陣列中的所有元素。unordered_set 是一種容器,類似於 vector,但它不允許重複的元素,並且元素的迭代順序是不確定的。nums1.begin() 和 nums1.end() 是迭代器,分別指向 nums1 陣列的第一個元素和陣列之後的位置(不包括陣列的最後一個元素)。 19 20 //for (int num : nums2) { 21 //這是一個基於範圍的for迴圈(range-based for loop),是C++11引入的新特性。這種迴圈的語法糖使得遍歷容器變得非常簡潔。這裡的意思是,對於 nums2 中的每個元素 num,執行花括號 {} 內的程式碼塊。 22 23 //if (nums_set.find(num) != nums_set.end()) { 24 //這行程式碼檢查當前遍歷到的元素 num 是否存在於 nums_set 中。nums_set.find(num) 會返回一個迭代器,指向 nums_set 中與 num 相等的元素。如果 num 不在 nums_set 中,find 函式將返回 nums_set.end(),這是一個指向 nums_set 結束之後的迭代器。 25 26 //result_set.insert(num); 27 //如果 num 在 nums_set 中找到了,這行程式碼將 num 插入到另一個 unordered_set 物件 result_set 中。由於 unordered_set 不允許重複元素,如果 num 已經被插入,它不會被再次插入。 28 29 //return vector<int>(result_set.begin(), result_set.end()); 30 //這行程式碼將 result_set 轉換成一個 vector(向量),並返回這個向量。vector<int>(result_set.begin(), result_set.end()) 是一種初始化 vector 的方式,它包含了 result_set 中的所有元素。 31 32 //總的來說,這段程式碼的目的是找出兩個陣列的交集,並將結果儲存在一個 vector 中返回。它使用了 unordered_set 來快速檢查元素是否存在,並利用基於範圍的for迴圈來簡化程式碼。
1 //只能算默寫了一遍 完全是新學的規範 2 //確實 沒有限制單個元素數值的大小 不能用常規的陣列來處理 3 class Solution { 4 public: 5 vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { 6 unordered_set<int> ans; 7 unordered_set<int> tmp(nums1.begin(),nums1.end()); 8 for (int num : nums2) { 9 if (tmp.find(num) != tmp.end()) { 10 ans.insert(num); 11 } 12 } 13 vector<int> res(ans.begin(),ans.end()); 14 return res; 15 } 16 };
202題我是常規求餘數相加
1 class Solution { 2 public: 3 bool isHappy(int n) { 4 unordered_set<int> tmp; 5 int sum = 0; 6 int num = n; 7 int div; 8 int remainder; 9 while (num) { 10 while (num != 0) { 11 div = num/10; 12 remainder = num%10; 13 sum += remainder*remainder; 14 num = div; 15 } 16 if (sum == 1) { 17 return true; 18 } 19 if (tmp.find(sum) == tmp.end()) { 20 tmp.insert(sum); 21 } 22 else { 23 return false;; 24 } 25 num = sum; 26 sum = 0; 27 } 28 return false; 29 } 30 };
但是看題解有很有意思的快速求各位平方和的做法,還挺有趣的。
1 int calculateNum(int n){ 2 string str = to_string(n); 3 int res = 0; 4 for (char i:str){ 5 int num = i - '0'; 6 res = res + num*num; 7 } 8 return res; 9 }
1題上來當然是暴力解法快速帶走啊。
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 vector<int>ret(2); 5 for (int i = 0; i < nums.size(); ++i) { 6 for (int j = i + 1; j < nums.size(); ++j) { 7 if (nums[i] + nums[j] == target) { 8 ret[0] = i, ret[1] = j; 9 return ret; 10 } 11 } 12 } 13 return ret; 14 } 15 };
好吧,步入正題,想想怎麼用雜湊表的知識解決。
1 //排序後 從小到大排序 然後左右開始遍歷相加 這樣時間複雜度是O(n) 排序的時間複雜度是O(logn) 相加也是比O(n^2)小的 2 //但是這樣的話,下標會亂,我需要一個東西,可以把下標和對應的數值存進去 就是你了underorder_map 甚至不需要排序 直接做減法 看看裡面有沒有對應的數值即可 3 4 class Solution { 5 public: 6 vector<int> twoSum(vector<int>& nums, int target) { 7 vector<int>ret(2); 8 unordered_map<int,int> map; 9 for (int i = 0; i < nums.size(); i++) { 10 if (map.find(target - nums[i]) != map.end()) { 11 ret[0] = i; 12 ret[1] = map[target - nums[i]]; 13 return ret; 14 } 15 map[nums[i]] = i; 16 } 17 return ret; 18 } 19 };