打卡第四十天
2道简单题+1道中等题

题目:

思路:哈希表+位运算
代码:
class Solution {
public:int similarPairs(vector<string>& words) {unordered_map<int,int> cnt;int ans = 0;for(auto &s: words){// 遍历words中的每个字符串int mask = 0;for(char c: s){// 遍历当前字符串中的每个字符mask |= 1<<(c-'a');//将字符映射到bit位置}ans += cnt[mask];// 累加之前出现过相同字符集合的字符串数量cnt[mask] += 1;// 更新当前字符集合的出现次数}return ans;}
};

题目:

思路:把每个数字拆成"首位"和"末位",用当前数字的末位去匹配之前所有数字的首位,哈希表。
代码:
class Solution {
public:int countBeautifulPairs(vector<int> &nums) {int ans = 0, cnt[10]{}; // cnt: 统计首位数字出现次数的数组for (int x: nums) { for (int y = 1; y <= 9; y++) { // 遍历所有可能的首位数字if (gcd(x % 10, y) == 1) { // 检查当前数字的末位与y是否互质ans += cnt[y]; // 如果互质,累加之前出现过的所有首位数字为y的数量}}while (x >= 10) { x /= 10; // 不断除以10,直到剩下首位数字}cnt[x]++; // 更新首位数字的计数}return ans; }
};
耗时≈一小时 明天继续