目录
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;
else
return 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;
}
};