本文主要是介绍31.哀家要长脑子了!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
不行啊 这个不能停啊
1.451. 根据字符出现频率排序 - 力扣(LeetCode)
哎哟,每次朦朦胧胧似懂非懂的,一看到感觉就是用无序map,但是让我上手我又不知道怎么写了,烦死了!
说一下:用一个unordered_map统计每个字符出现的次数,因为它是unordered的,所以它是不支持按key或者按value排序的,把它再放进一个数组可以用sort函数按字符的出现次数排序呀,最后遍历这个数组,看字符出现次数出现了几次,构造字符串的时候,相应字符也要出现几次。
class Solution {
public:string frequencySort(string s) {unordered_map<char, int>map;for(char ch : s){map[ch]++;}vector<pair<char,int>> vec;for(auto &it : map){vec.emplace_back(it);}sort(vec.begin(), vec.end(), [](const pair<char, int> &a, const pair<char, int> &b) { return a.second > b.second; });string res;for(auto &[ch, num] : vec){for(int i = 0; i < num; i++){res += ch;}} return res;}
};
for(auto &[ch, num] : vec)
这这这是一个foreach语句,在这里,[ch, num]就是结构化绑定的部分,它告诉编译器从迭代的元素中解构出两个部分,并分别绑定到str和num这两个变量上
sort(vec.begin(), vec.end(), [](const pair<char, int> &a, const pair<char, int> &b){
return a.second > b.second;
});
这这这是一个lambda表达式,我说第三个。
Lambda表达式语法定义
[capture list] (parameters) mutable throw() -> return type { statement }
捕获列表 参数列表 可变规格异常说明 返回类型 函数体
- 捕获列表:在C++规范中也称为Lambda导入器,捕获列表总是初夏在Lambda函数的开始处。实际上,[ ]是Lambda引出符。编译器根据该引出符判断接下来的代码是否是Lambda函数,捕获列表能够捕捉上下文中的变量以供Lambda函数使用。换句话说,Lambda表达式常常会被用在一个函数里,但它只能访问外部的全局变量而并不能访问函数里的局部变量列表,只要被列在了列表内,那么表达式都可以对其进行访问。
捕获变量的方式有三种:
• 按值捕获(capture by value)
• 按引用捕获(capture by reference)
• 按值捕获(implict capture)
2.696. 计数二进制子串 - 力扣(LeetCode)
巧妙太巧妙了
把每一部分连续的0或连续的1的长度记录下来,长度比较 小的那一个就是对于这部分的0、1来说可以满足题目条件的子串的出现次数
class Solution {
public:int countBinarySubstrings(string s) {vector<int> counts(26);int i = 0, len = s.size();while(i < len){char ch = s[i];int count = 0;while(i < len && ch == s[i]){i++, count++;}counts.push_back(count);}int res = 0;for(int i = 1; i < counts.size(); i++){res += min(counts[i], counts[i-1]);} return res;}
};
我真的觉得6
3.467. 环绕字符串中唯一的子字符串 - 力扣(LeetCode)
求不同非空子串在base中出现的个数,其实就是求最长的连续子串捏,就是说,每个以某字母结尾的最长连续子串能贡献的唯一子串数量恰好就是它的长度,因为连续子串中的每一个前缀都是一个有效子串(参考示例3)
所以在这里,维护一个数组dp,其中dp[i]表示以字母表中第i个字母结尾的最长连续子串的长度
class Solution {
public:int findSubstringInWraproundString(string s) {// 用一个dp数组 里面放着以当前字母为结尾的最长连续子串vector<int> dp(26);int k = 0;for(int i = 0; i < s.size(); i++){// 看看这两个字母之间是不是连续的 // +26的原因是a-z会是-1 这样+26取模也会是1// %可以类比循环队列操作if(i && (s[i] - s[i-1] + 26) % 26 == 1){k++;}else{k = 1;}// 当当前记录的连续子串的长度大于之前记录的长度 此时才会更新 重新记录dp[s[i] - 'a'] = max(dp[s[i] - 'a'], k);}return accumulate(dp.begin(), dp.end(), 0);}
};
其实我有点懵懵懂懂的,我只能写个注释了。。。
这篇关于31.哀家要长脑子了!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!