【笔试训练】day12

本文介绍了C++中的三个编程问题:1)删除两个字符串的公共字符;2)找到两个链表的第一个公共节点,类似LCA问题;3)计算字符串mari和shiny中sh子序列的数量。
摘要由CSDN通过智能技术生成

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;
}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值