摘要:假設(shè)模式起始位置為,判斷后續(xù)序列是否滿足條件,其實只需要判斷與是否相同。如果數(shù)組中不存在至少重復(fù)次且長度為的模式,返回注意這里需要加一,否則會錯
思路:不斷地讓n和n-1做與運算(n&=(n-1)),直到n變?yōu)?
因為每次運算會使n的最低位被翻轉(zhuǎn)
class Solution {public: int hammingWeight(uint32_t n) { int res = 0; while(n) { n&=(n-1); res++; } return res; }};
思路:主要是確保 res 一定是個位數(shù),其他的不難想出來
class Solution {public: int addDigits(int num) { int res = 0; while(num) { res += num %10; num /= 10; if(res >= 10)//確保res是1位數(shù) { res %= 10; res++; } } return res; }};
思路:很直接的想法,兩層for循環(huán),遍歷兩個數(shù)組,判斷對應(yīng)的值相減是否小于d,若小于,則–res;
class Solution {public: int findTheDistanceValue(vector<int>& arr1, vector<int>& arr2, int d) { int res = arr1.size(); for(int &i : arr1) { for(int &j : arr2) { if(abs(i-j) <= d) { --res; break; } } } return res; }};
思路:兩層循環(huán)完美解決,外循環(huán)決定第一個數(shù),內(nèi)循環(huán)產(chǎn)生所有順次數(shù),只有當(dāng)數(shù)字范圍在[low, high]中時,存入結(jié)果。
比如:
i為1時,內(nèi)層循環(huán)產(chǎn)生 1、12、123、…、123456789
i為2時,內(nèi)層循環(huán)產(chǎn)生2、23、234、…、23456789
由于順次數(shù)的長度最長為9,所以只用遍歷1-8開頭的所有順次數(shù)
class Solution {public: vector<int> sequentialDigits(int low, int high) { vector<int> res; for(int i=1; i<=9; ++i) { int num = i; for(int j = i+1; j<=9; ++j) { num = num*10 + j; if(num >= low && num <= high) { res.push_back(num);//每次循環(huán)都在res后面加一位數(shù) } } } sort(res.begin(), res.end()); return res; }};
思路:快樂哈希表,舒服你我他
class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { unordered_set<int> res; unordered_set<int> nums1_set(nums1.begin(), nums1.end()); for(auto &n2 : nums2) { // nums2 的元素在 nums1_set 中出現(xiàn)過 if(nums1_set.find(n2) != nums1_set.end()) { res.insert(n2); } } return vector<int> (res.begin(), res.end()); }};
思路:四層循環(huán)暴力破解
class Solution {public: int countQuadruplets(vector<int>& nums) { int n=nums.size(); int count=0; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { for(int k=j+1;k<n;k++) { for(int l=k+1;l<n;l++) { if(nums[i]+nums[j]+nums[k]==nums[l]) { count++; } } } } } return count; }};
方法二:統(tǒng)計左側(cè)的兩數(shù)之和,同時統(tǒng)計右側(cè)的兩數(shù)之差,比較左側(cè)是否與右側(cè)相等
class Solution {public: int countQuadruplets(vector<int>& nums) { int res = 0; unordered_map<int, int> map; int size = nums.size(); for(int i=1; i<size-2; ++i) { for(int j=0; j<i; ++j) { map[nums[i] + nums[j]]++; } for(int j=i+2; j<size; ++j) { if(map.count(nums[j] - nums[i+1])) { res += map[nums[j] - nums[i+1]]; } } } return res; }};
思路:
由于模式的長度為m,且需要重復(fù)k次,所以模式起始位置在[0, n - m * k]之間。
假設(shè)模式起始位置為i,判斷后續(xù)序列[ i + m, i + m * k )是否滿足條件,其實只需要判斷arr[ j ]與arr[ j - m ]是否相同。
class Solution {public: bool containsPattern(vector<int>& arr, int m, int k) { int size = arr.size(); //如果數(shù)組中不存在至少重復(fù) k 次且長度為 m 的模式,返回false if(size < m*k) return false; int i, j; for(i=0; i<size-m*k + 1; ++i) {//注意這里需要加一,否則會錯 for(j=i+m; j<i+m*k; ++j) { if(arr[j] != arr[j-m]) break; } if(j == i + m*k) return true; } return false; }};
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/124079.html
摘要:三結(jié)對編程排位賽四個人為一組,由隊長帶隊刷題,每周根據(jù)這周四個人的刷題總數(shù)進(jìn)行隊伍間排名。萬人千題結(jié)對編程排位賽如果想?yún)⒓拥牡诙诘耐瑢W(xué),可以先聯(lián)系作者加群,看看第一期的同袍是如何奮斗的。 ...
閱讀 7684·2023-04-25 14:36
閱讀 1768·2021-11-22 09:34
閱讀 2156·2019-08-30 15:55
閱讀 3153·2019-08-30 11:19
閱讀 1314·2019-08-29 15:17
閱讀 557·2019-08-29 12:47
閱讀 3004·2019-08-26 13:38
閱讀 2633·2019-08-26 11:00