做網(wǎng)站多少錢一年武漢全網(wǎng)推廣
LeetCode 242 有效的字母異位詞
題目:
給定兩個字符串?s
?和?t
?,編寫一個函數(shù)來判斷?t
?是否是?s
?的字母異位詞。
注意:若?s
?和?t
?中每個字符出現(xiàn)的次數(shù)都相同,則稱?s
?和?t
?互為字母異位詞。
示例?1:
輸入: s = "anagram", t = "nagaram" 輸出: true
示例 2:
輸入: s = "rat", t = "car" 輸出: false
提示:
1 <= s.length, t.length <= 5 * 104
s
?和?t
?僅包含小寫字母
思路:
首先需要理解字母異位詞的含義,簡單理解為:兩字符串的長度相同,字母相同,但順序不同。
字母異位詞簡意為兩字符串長度相同,字母相同,順序不同。如果是異位詞那么輸出true,否則就輸出false。
首先我的想法是:第一步判斷兩個字符串的長度是否相等,其次,分別統(tǒng)計每一個字母出現(xiàn)的次數(shù),在進行比較。如果都一樣,那么輸出true,否則false。
既然提示說,只會出現(xiàn)小寫字母,那我們不妨用一個大小為27的數(shù)組來統(tǒng)計對應的字母出現(xiàn)的次數(shù),已知小寫英文字母的ASCII范圍為97-122,那么分別對應1-26的下標數(shù)組。
初始化這個數(shù)組全為0,當?shù)谝粋€統(tǒng)計第一個字符串的時候,我們采用自增,統(tǒng)計第二個字符串的時候,我們采用自減。是異位詞的話,那么說明它最后會回到初始狀態(tài),如果出現(xiàn)其他情況,比如-1,或者加和不為0,那么false。
上代碼!
class Solution {
public:bool isAnagram(string s, string t) {int nums = s.size();int numt = t.size();if (nums != numt) {return false;}int a[27] = { 0 };for (int i = 0; i < nums; i++) {a[s[i] - 97]++;}for (int i = 0; i < numt; i++) {a[t[i] - 97]--;}int sum = 0;for (int i = 0; i < 27; i++) {sum += a[i];if (a[i] < 0) {return false;}else if (sum != 0) {return false;}}return true;}
};
這代碼,夠垃圾,也夠直接!
?
LeetCode 349 兩個數(shù)組的交集
題目:
給定兩個數(shù)組?nums1
?和?nums2
?,返回?它們的?交集?。輸出結(jié)果中的每個元素一定是?唯一?的。我們可以?不考慮輸出結(jié)果的順序?。
示例 1:
輸入:nums1 = [1,2,2,1], nums2 = [2,2] 輸出:[2]
示例 2:
輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出:[9,4] 解釋:[4,9] 也是可通過的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
思路:
首先,題目要求我們交到兩個數(shù)組的交集部分,并且返回交集的元素只能是唯一的,就是不重復的意思。
那么我們第一步應該先把兩個數(shù)組中相同的部分找出來,然后再進行一次遍歷,刪除相同元素就可以返回結(jié)果了。
具體怎么做呢?
用數(shù)組a記錄數(shù)組nums1中每個元素出現(xiàn)的次數(shù),再統(tǒng)計數(shù)組nums2每一項出現(xiàn)的次數(shù),做好標記,輸出交集即可。
上代碼!
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {int len1 = nums1.size();int len2 = nums2.size();int a[10] = { 0 };int b[10] = { 0 };for (int i = 0; i < len1; i++) {a[nums1[i]]++;}for (int i = 0; i < len2; i++) {if (a[nums2[i]] != 0) { b[nums2[i]] = 1;}}vector<int> ss;for (int i = 0; i < 10; i++) {if (b[i] != 0) {ss.push_back(i);//由于是容器的返回,用push_back傳值}}return ss;}
};
你以為這就完了嗎,LeetCode真惡心,你告訴我這是個什么東西。
改唄,還能怎么辦!
好好好,加到1000還不夠,是我保守了。
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {int len1 = nums1.size();int len2 = nums2.size();int a[9999] = { 0 };int b[9999] = { 0 };for (int i = 0; i < len1; i++) {a[nums1[i]]++;}for (int i = 0; i < len2; i++) {if (a[nums2[i]] != 0) { b[nums2[i]] = 1;}}vector<int> ss;for (int i = 0; i < 9999; i++) {if (b[i] != 0) {ss.push_back(i);//由于是容器的返回,用push_back傳值}}return ss;}
};