🔥博客主页: A_SHOWY
🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_
【1】100212.统计前后缀下标对
100212. 统计前后缀下标对 Ihttps://leetcode.cn/problems/count-prefix-and-suffix-pairs-i/
熟练掌握判断前后缀的bool方法就好。
class Solution {
public:bool isPrefix(const string& str,const string& prefix){if(str.length() < prefix.length()){return false;}return str.substr(0,prefix.length()) == prefix;}bool isSuffix(const string& str,const string& suf){if(str.length() < suf.length()){return false;}return str.substr(str.length() - suf.length()) == suf;}int countPrefixSuffixPairs(vector<string>& words) {int sum = 0;for(int i = 0; i < words.size(); ++i){for(int j = i + 1; j < words.size(); ++j){if(isPrefix(words[j],words[i]) && isSuffix(words[j],words[i])){sum++;}}}return sum;}
};
【2】100229 最长公共前缀的长度
100229. 最长公共前缀的长度https://leetcode.cn/problems/find-the-length-of-the-longest-common-prefix/
这道题目是一个较为简单的哈希表的问题,难点是能否想到转换成将arr1的所有元素的前缀存入哈希表,然后对arr2进行遍历,找最长的公共前缀(找最大的数),从最大的数,除以10操作,直到包含在st哈希表中。
- 将arr1的所有前缀存起来,让arr2从最大的数一直除以10找到最大(最长)公共前缀。
- 时间复杂度,对于一个数M,其长度为logM,arr1的长度为m,arr2的长度为n, 所以时间复杂度是O((m + n)log(M))
class Solution {
public:int longestCommonPrefix(vector<int>& arr1, vector<int>& arr2) {unordered_set<int> st;for(int x : arr1){for(;x;x /= 10){st.insert(x);}}int mres = 0;for(int x : arr2){for(;x && !st.contains(x); x /= 10);mres = max(mres,x);}return mres ? to_string(mres).length() : 0;}
};
【3】出现频率最高的的质数
3044. 出现频率最高的质数https://leetcode.cn/problems/most-frequent-prime/
这道题目的主要特点就是繁琐,需要设置一个constexpr,然后要判断是否为质数,再进行循环模拟,最后求出出现次数最多的质数,如果一般多,还要比较大小。思路就是用哈希表存一下。
- 首先是第一部分求质数,熟练了就好,记住i从2开始,不然会报错除以0
- 第二部分就是记住constexpr设置8个方向,然后对每个点进行遍历,这里一定注意等号不要越界,每个方向一条道走到黑,只要不越界,然后记录这个数,判断是不是质数,是的话哈希表这个数就加一
- 最后一部分是判断了遍历,看谁的值大,就是次数多。
class Solution {
public:static constexpr int dirs[8][2] = {{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1}};bool is_prime(int n){for(int i = 2; i * i <= n; i++){if(n % i == 0) {return false;}}return true;}int mostFrequentPrime(vector<vector<int>>& mat) {int m = mat.size();int n = mat[0].size();unordered_map<int,int> mp;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){for(auto &d : dirs){int x = i + d[0];int y = j + d[1];int v = mat[i][j];while(x >= 0 && x < m && y >= 0 && y < n){v= v * 10 + mat[x][y];if(is_prime(v)){mp[v]++;}x += d[0];y += d[1];}}}}int ans = -1,mx_prime = 0;for(auto &[v,c] : mp){//v是数,c是个数if(c > mx_prime){ans = v;mx_prime = c;}else if(c == mx_prime){ans = max(ans,v);}}return ans;}
};