1.删除公共字符
思路:
无
代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<unordered_map> using namespace std; int main() { string str1, str2; getline(cin, str1); getline(cin, str2); unordered_map<char, int> mp; // cout<<str1<<" "<<str2<<endl; for (int i = 0; i < str2.size(); i++) { mp[str2[i]]++; } string ans = ""; for (int i = 0; i < str1.size(); i++) { if (mp.count(str1[i]))continue; ans += str1[i]; } cout << ans << endl; return 0; } // 64 位输出请用 printf("%lld")
2.两个链表的第一个公共节点
思路:
先计算每个链表的长度,长的那一条就先走,走到剩下的节点数量和另一条相等。然后两个链表再一起走,直到找到相同节点为止。
这个思路在LCA求最近公共祖先的算法里也有用到。
代码:
#define _CRT_SECURE_NO_WARNINGS 1 class Solution { public: ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) { if (!pHead1 || !pHead2)return nullptr; ListNode* cur1 = pHead1; ListNode* cur2 = pHead2; int n1 = 0; int n2 = 0; while (cur1) { cur1 = cur1->next; n1++; } while (cur2) { cur2 = cur2->next; n2++; } cur1 = pHead1; cur2 = pHead2; if (n1 > n2) { while (n1 > n2) { cur1 = cur1->next; n1--; } } else { while (n1 < n2) { cur2 = cur2->next; n2--; } } while (cur1 && cur2 && cur1 != cur2) { cur1 = cur1->next; cur2 = cur2->next; } return cur1; } };
3.mari和shiny
思路:
求子序列的数量。子序列的相对位置是固定的。于是可以想到,对于每一个’y‘,前面能组成多少个”sh“。要想算出”sh“的数量,也可以用类似的思路。对于每一个’h‘,前面有多少个’s'就表示以当前‘h’结尾的”sh“序列有多少个。于是我们只需要遍历一遍数组,遇到‘s'就记录一下,遇到’h'就结算一下sh,遇到y,就结算一下‘shy'。
代码:
#include <iostream> using namespace std; int main() { string str; int n; cin>>n; cin>>str; long long a=0,b=0; long long ans=0; long long k=0;//记录每一个’y‘前面的”sh"的数量 for(int i=0;i<n;i++){ if(str[i]=='s')a++; else if(str[i]=='h')b=a,k+=b; else if(str[i]=='y'){ ans+=k; } } cout<<ans<<endl; return 0; }