本文主要是介绍24.哀家要长脑子了!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
1.594. 最长和谐子序列 - 力扣(LeetCode)
2.350. 两个数组的交集 II - 力扣(LeetCode)
3.554. 砖墙 - 力扣(LeetCode)
4.9. 回文数 - 力扣(LeetCode)
5.13. 罗马数字转整数 - 力扣(LeetCode)
6.58. 最后一个单词的长度 - 力扣(LeetCode)
1.594. 最长和谐子序列 - 力扣(LeetCode)
烦死了烦死了!!总是模模糊糊一知半解的感觉,然后感觉自己能做,搞半天又去看题解了,搞毛啊你。
这个map中的索引key是num元素,val是这个num元素又多少个啊。
class Solution {
public:int findLHS(vector<int>& nums) {unordered_map<int, int> map;for(int num : nums){map[num]++;}int res = 0;for(auto [key,val] : map){if(map.count(key+1)){res = max(res, val + map[key+1]);}}return res;}
};
2.350. 两个数组的交集 II - 力扣(LeetCode)
这个题目有意思的地方就在于,它不仅仅只是交集元素出现,这个交集元素在答案它还要重复出现, 出现多少次呢,以出现次数少的那次为标准。
怎么做到的呢:首先以长度小的数组记录到map中。 然后就需要操作map中的val值了,找到一次num并且判断它在map中作为索引所对应的值不为0,就可以把它记录到答案中去,然后要减一。代表它出现的次数少一次了。
class Solution {
public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {if(nums1.size() > nums2.size()) return intersect(nums2, nums1);unordered_map<int, int> map;for(int num : nums1){map[num]++;}vector<int> res;for(int num : nums2){if(map.count(num) && map[num] != 0){res.push_back(num);--map[num];}}return res;}
};
3.554. 砖墙 - 力扣(LeetCode)
晕头转向 晕头转向哈哈哈 要不这堵墙撞死我吧
要找穿过砖块数量最少的等价于要找砖块边缘线穿过行数最多的。
我其实没有搞懂,我只能对着代码解释一下我自己的理解 ToT。
哈希表cnt中记录的是,在不同水平位置上的累计砖块宽度值出现的次数。这里的”累计砖块宽度值“指的是从墙最左边开始到某个点为止,所有砖块宽度的和 (但不包括最后一块砖的宽度,因为我们关心的是缝隙的位置),就是找缝隙。
以上图中的样例为准,一行一行遍历得出的map就是这样子的 意思就是,第1块砖后面有缝隙的有3行,第3块砖后面有缝隙的有2行,第5块砖后面有缝隙的有2行,以此类推....
把总的行数减去砖块行数被共享最多的缝隙数,就是可以跨过最少的砖块行数。
class Solution {
public:int leastBricks(vector<vector<int>>& wall) {unordered_map<int,int> cnt;for(auto &widths : wall){int n = widths.size();int sum = 0;for(int i = 0; i < n - 1; i++){sum += widths[i];cnt[sum]++;}}int maxCnt = 0;for(auto& [_, c] : cnt){maxCnt = max(maxCnt, c);}return wall.size() - maxCnt;}
};
4.9. 回文数 - 力扣(LeetCode)
小姐姐吃完方便面和两个Q蒂还有辣条回来开始水题了 哈哈。。。。
nia,我都不好意思说出来,那行关键代码我没写出又死懒,直接看的答案。我服了妈妈
res = res * 10 + n % 10;
class Solution {
public:bool isPalindrome(int x) {if(x < 0) return false;long long n = x, res = 0;while(n){res = res * 10 + n % 10;n /= 10; }if(res == x)return true;elsereturn false;}
};
5.13. 罗马数字转整数 - 力扣(LeetCode)
是一道数学技巧题的感觉,当时感觉总是静不下心来,只想快点搞完走了,感觉是不是吃零食吃多了的原因,有点浮躁
其实就是用一个map把他们的映射关系存起来,罗马数字是索引,阿拉伯数字是值。然后判断一下左边的是不是比右边的小,如果是的话就把左边这个数字变为负的,嗯,就是酱紫,为什么你不会做。。。。。。。。
class Solution {
public:int romanToInt(string s) {unordered_map<char, int> map = {{'I', 1},{'V', 5},{'X', 10},{'L', 50},{'C', 100},{'D', 500},{'M', 1000}};int res = 0;for(int i = 0; i < s.size(); i++){if(i < s.size() - 1 && map[s[i]] < map[s[i+1]]){res -= map[s[i]]; }else{res += map[s[i]];}}return res;}
};
6.58. 最后一个单词的长度 - 力扣(LeetCode)
是这样啊:要判断最后一个单词的长度,那就从字符串的末尾开始找噻。看样例可以发现最后一个单词后面还可能有空格,那就把指针先移动到不是空格的位置噻。
class Solution {
public:int lengthOfLastWord(string s) {int n = s.size() - 1;while(s[n] == ' '){n--;}int res = 0;while(n >= 0 && s[n] != ' '){n--, res++;}return res;}
};
这篇关于24.哀家要长脑子了!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!