天梯赛比较好的一些题目(菜鸟只写L1版)

目录

1-L1-094 剪切粘贴

2-L1-050 倒数第N个字符串

3-L2-049 鱼与熊掌

4-L1-101 别再来这么多猫娘了!

5-L1-103 整数的持续性

 6-L1-080 乘法口诀数列


1-L1-094 剪切粘贴

第一题

注意 : 因为要插入的地方前面是一个字符串,后面也是一个字符串,所以我们可以直接查找这两个字符串拼接后形成的新的字符串

另外补充:string中的一些函数


删除:s.erase(起始下标,删除子串的长度);

插入:s.insert(起始下标,插入的子串);

替换:s.replace(起始的下标,更换的子串的长度,要更换的子串);

查找:s.find(要查找的子串)         e g: if(s.find("点个赞吧")!=string::npos)       xxxxxx


AC Code

#include 
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

signed main()
{
	IOS
	string s;
	cin>>s;
	int n;
	cin>>n;
	for(int i=0;i>a>>b;
		cin.ignore();
		a--;
		string s1,s2;
		cin>>s1;
		cin>>s2;
		string temp;
		temp = s.substr(a,b-a);
		s.erase(a,b-a);
		if(s.find(s1+s2)!=string::npos)
		{
			s.insert(s.find(s1+s2)+s1.size(),temp);
		}
		else
		{
			s+=temp;
		}
	}
	cout<

2-L1-050 倒数第N个字符串

第二题

这个题重在思路,如果正常模拟的话会很麻烦,但是仔细观察会发现其实就是一个进制问题,类比十进制或者26进制,手推几个简单的例子规律就出来了,只需要从后往前一项一项的填即可

废话不多说:

AC Code

#include 
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

signed main()
{
	IOS
	int l,n;
	cin>>l>>n;
	int sum = pow(26,l);
	sum = sum - n;
	char ans[7]={0};
	for(int i=l-1;i>=0;i--)
	{
		ans[i] = sum % 26 + 'a';
		sum/=26;//可以类比十进制来写
	}
//	cout<

3-L2-049 鱼与熊掌

第三题

这个题需要了解一下unordered_map的用法,并且需要两个进行嵌套使用,其实是和map数组差不多的,但是用map的话他会自动排序,比较浪费时间,所以就用这个unordered_map来写(主要是因为这个题目的要求太严格了,用二元组嵌套会炸内存,用map数组会时间超限),当然也可以用结构体写。

AC Code

#include 
using namespace std;

int main() {
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n, m;
	cin >> n >> m;
//	map mp[10005];
	unordered_map> mp;
	for (int i = 0; i < n; i++) {
		int k;
		cin >> k;
		for (int j = 0; j < k; j++) {
			int num;
			cin >> num;
			mp[i][num]++;
		}
	}
	int k;
	int sum = 0;
	cin >> k;
	while (k--) {
		sum = 0;
		int a, b;
		cin >> a >> b;
		for (int i = 0; i < n; i++) {
			if (mp[i][a] && mp[i][b])
				sum++;
		}
		cout << sum << endl;
	}

	return 0;
}

4-L1-101 别再来这么多猫娘了!

天坑第四题

天坑题!!!

因为题目中说了违禁词是由字母组成的,而且要把违禁词替换为一个含有字母的子串,这就导致了如果违禁词中出现了 “censored ”,你找出之后直接替换为“那么这层循环不炸了吗 

所以我们再找到违禁词之后,先把他替换为另一个非违禁词的字符串 ,不然也就炸了,最后再遍历一遍,把这个字符串替换为即可~~~

AC Code

#include 
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'

int main() {
 IOS
	int n;
	cin >> n;
	cin.ignore();
	string s[105];
	for (int i = 0; i < n; i++) {
		// getline(cin, s[i]);
		cin >> s[i];
	}
	int sum = 0, k;
	cin >> k;
	cin.ignore();
	string ans;
	getline(cin, ans);
	for (int i = 0; i < n; i++) {
		while (ans.find(s[i]) != string::npos) {
			int t = ans.find(s[i]);
			sum++;
			ans.erase(t, s[i].size());
			ans.insert(t, "-_-");
		}
	}
	if (sum >= k)
		cout << sum << endl << "He Xie Ni Quan Jia!";
	else
		{
			while(ans.find("-_-")!=string::npos)
			{
			 	int t = ans.find("-_-");
			 	ans.erase(t,3);
			 	ans.insert(t,"");
			}
			cout<

5-L1-103 整数的持续性

第五题-不咋难但是煮波感觉有意义

 AC Code

#include 
using namespace std;
#define int long long
#define endl '\n'
int ans=0;
void solve(string s)
{
	if((int)s.size()==1) return ;
	ans++;
	string num;
	int res=1;
	for(int i=0;i>a>>b;
	map mp;
	for(int i=a;i<=b;i++)
	{
		ans=0;
		solve(to_string(i));
		mx = max(mx,ans);
		mp[ans]+=" ";
		mp[ans]+=to_string(i);
	}
	cout<

 6-L1-080 乘法口诀数列

没什么说的直接暴力就行 

第六题

AC Code

#include 
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

signed main()
{
	IOS
	string s;
	int a,b,n;
	cin>>a>>b>>n;
	s+=a+'0';
	s+=b+'0';
	int i=0,j=1;
	while(s.size()<=n)
	{
		int ans = (s[i]-'0')*(s[j]-'0');
		s+=to_string(ans);
		i++;j++;
	}
	for(int i=0;i

你可能感兴趣的:(算法,数据结构)