文章目录
- 前言
- 1. 删除公共字符
- 1.1 题目描述
- 1.2 解题思路
- 1.3 代码实现
- 2. 两个链表的第一个公共结点
- 2.1 题目描述
- 2.2 解题思路
- 2.3 代码实现
- 3. mari和shiny
- 3.1 题目描述
- 3.2 解题思路
- 3.3 代码实现
- 总结
前言
1. 删除公共字符
2. 两个链表的第一个公共结点
3. mari和shiny
1. 删除公共字符
1.1 题目描述
1.2 解题思路
简单的哈希应用,方法一:可以先将字符串2放入一个哈希表中,然后遍历第一个字符串,如果哈希表中存在就删除。(需要注意如果当前字符需要被删除,并且下一个字符也要被删除的情况)
方法二:遍历第一个字符串,如果如果不存在哈希表中,就添加到返回子串中。
1.3 代码实现
#include <iostream>
using namespace std;
#include <unordered_set>
#include <string>
int main() {int hash[300];string s, s1;getline(cin, s);getline(cin, s1);for (auto ch : s1) {hash[ch] = 1;}for (int i = 0; i < s.size(); i++) {if (hash[s[i]] == 1) {s.erase(i, 1);i--;}}if (s.size() == 0) cout << "";else cout << s;return 0;
}
2. 两个链表的第一个公共结点
2.1 题目描述
2.2 解题思路
方法一:我们遇到的问题就是它们的路径长度并不一样,所以不知道该如何找到第一个相同结点。我们可以依次统计出两个路径的各自的总长度,然后让路径长的一方先走,一直走到后续的路径与第二个路径的长度相同,那么问题就转化成了两个长度相同的链表找第一个相同的结点,到这里相信大家都会写了。
2.3 代码实现
class Solution {public:ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {ListNode* cur1 = pHead1, *cur2 = pHead2;int count1 = 0, count2 = 0;while (cur1) {count1++;cur1 = cur1->next;}while (cur2) {count2++;cur2 = cur2->next;}cur1 = pHead1;cur2 = pHead2;if (count1 > count2) {int d = count1 - count2;while (d--) cur1 = cur1->next;} else {int d = count2 - count1;while (d--) cur2 = cur2->next;}while (cur1 && cur2) {if (cur1->val == 6 && cur2->val == 6) printf("%p %p", cur1, cur2);if (cur1 == cur2) return cur1;cur1 = cur1->next;cur2 = cur2->next;}return nullptr;}
};
3. mari和shiny
3.1 题目描述
3.2 解题思路
线性dp,我们要找shy,肯定是先找s,找h的话,如果需要合法,它的个数应该是它前面s的个数,如果是y的话,它的个数应该是前面sh也就是h合法的个数,我们只需要三个变量进行统计就可以了。
3.3 代码实现
#include <iostream>
using namespace std;
#include <string>
int main()
{int n = 0; cin >> n;string str; cin >> str;long long s = 0, h = 0, y = 0;for(auto ch : str){if(ch == 's') s++;else if(ch == 'h') h += s;else if(ch == 'y') y += h;}cout << y;return 0;
}
总结
今天的难度也是一般,希望大家能坚持练习。
那么第天七的内容就到此结束了,如果大家发现有什么错误的地方,可以私信或者评论区指出喔。我会继续坚持训练的,希望能与大家共同进步!!!那么本期就到此结束,让我们下期再见!!觉得不错可以点个赞以示鼓励!